TIL/TypeScript

์œ ๋‹ˆ์˜จ๊ณผ ๋ฆฌํ„ฐ๋Ÿด (Union & Literal)

"์œ ๋‹ˆ" 2023. 12. 1. 18:50

 

 

๐Ÿ”๏ธ ์œ ๋‹ˆ์–ธ  (Union)

์œ ๋‹ˆ์–ธ์€ ๊ฒฐํ•ฉ, ์—ฐํ•ฉ๊ณผ ๊ฐ™์€ ๋œป์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ ์œ ๋‹ˆ์–ธ์€ ๋‘˜ ์ด์ƒ์˜ ํƒ€์ž…์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 

`|` ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์—ฌ๋Ÿฌ ํƒ€์ž…์„ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์•„๋ž˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด 'number  | string' ํƒ€์ž…์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ฉด, ์ด ๋ณ€์ˆ˜๋Š” ์ˆซ์ž์™€ ๋ฌธ์ž ๋ชจ๋‘๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

let physicist : number | string;
physicist = "Marie Curie";
physicist = 86;

 

๊ฐ’์ด ์œ ๋‹ˆ์–ธ ํƒ€์ž…์ผ ๋•Œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์œ ๋‹ˆ์–ธ์œผ๋กœ ์„ ์–ธํ•œ ํƒ€์ž…์— ์กด์žฌํ•˜๋Š” ๋ฉค๋ฒ„์˜ ์†์„ฑ์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์™ธ์˜ ํƒ€์ž…์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด ํƒ€์ž… ๊ฒ€์‚ฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. 

 

physicist๋Š” number | string ํƒ€์ž…์œผ๋กœ ๋‘ ๊ฐœ์˜ ํƒ€์ž…์— ๋ชจ๋‘ ์กด์žฌํ•˜๋Š” toString()์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, toUpperCase()์™€ toFixed()๋Š” ๊ฐ๊ฐ number/string ํƒ€์ž…์— ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

๐Ÿ”๏ธ ๋‚ด๋กœ์ž‰ (Narrowing)

 

๋‚ด๋กœ์ž‰์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ์ขํ˜€๋‚˜๊ฐ€๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ์กฐ๊ฑด๋ฌธ์ด๋‚˜ ๊ฐ’ ํ• ๋‹น์„ ํ†ตํ•œ ๋‚ด๋กœ์ž‰์ด ์žˆ์œผ๋ฉฐ, ๊ฐ€์žฅ ํ”ํ•˜๊ฒŒ๋Š” typeof ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์‹œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” typeof์˜ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ์š”. 

์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด if ๋ฌธ์—์„œ typeof researcher๊ฐ€ 'string'์ธ์ง€ ํ™•์ธํ•ด์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์— researcher ํƒ€์ž…์ด string์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. 

let researcher = Math.random() > 0.5 
	? "Frida Kallio"
	: 60; 

if (typeof researcher === "string") {
	researcher.toUpperCase(); // Ok: string
}

 

 

๐Ÿ”๏ธ ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž… (Literal Type) 

๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…์€ ์ข€ ๋” ๊ตฌ์ฒด์ ์ธ ๋ฒ„์ „์˜ ์›์‹œ ํƒ€์ž…์œผ๋กœ๋„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ฐ’ ์ž์ฒด๋ฅผ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋กœ ์‚ดํŽด๋ณด๋ฉด, philosopher๋Š” ๋”ฑ ๋ณด๊ธฐ์— string ํƒ€์ž…์ด์ง€๋งŒ ๋‹จ์ง€ string ํƒ€์ž…์ด ์•„๋‹Œ "Hypatia"๋ผ๋Š” ํŠน๋ณ„ํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…์˜ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. 

const philosopher = "Hypatia";

 

 

boolean, null, undefined ํƒ€์ž… ์™ธ์— number, string๊ณผ ๊ฐ™์€ ๋ชจ๋“  ์›์‹œ ํƒ€์ž…์—๋Š” ๋ฌดํ•œํ•œ ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…์ด ์žˆ์Šต๋‹ˆ๋‹ค.

boolean์€ true | false ์˜ ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…์„ ๊ฐ€์งˆ์ˆ˜ ์žˆ๊ฒ ๊ณ , number๋Š” 0 | 1 | 2... ๋“ฑ๋“ฑ ์ˆ˜๋งŽ์€ number ๊ฐ’์„ ๋ฆฌํ„ฐ๋Ÿด ๊ฐ’์œผ๋กœ ๊ฐ€์งˆ์ˆ˜ ์žˆ๊ฒ ์ฃ . 

 

์œ ๋‹ˆ์–ธ ํƒ€์ž…์—์„œ ๋ฆฌํ„ฐ๋Ÿด๊ณผ ์›์‹œ ํƒ€์ž…์„ ์„ž์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 

์•„๋ž˜ ์˜ˆ์‹œ ์ฝ”๋“œ์™€ ๊ฐ™์ด lifespan์€ number ํƒ€์ž…๋„ ๋˜๊ณ  'ongoing' ๊ฐ’์œผ๋กœ๋„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let lifespan: number | "ongoing" | "uncertain";

lifespan = 80; //Ok
lifespan = "ongoing" //Ok

 

 

๐Ÿ”๏ธ ํƒ€์ž… ๋ณ„์นญ (Type Alias)

๊ฐ€๋” ๋ฐ˜๋ณต์ ์ด๊ณ , ์ž…๋ ฅ์ด ๊ธด ์œ ๋‹ˆ์–ธ ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ๋ฅผ ๋งˆ์ฃผํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ ์ด๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ๋•๋Š” ๊ฒƒ์ด ํƒ€์ž… ๋ณ„์นญ์ž…๋‹ˆ๋‹ค. 

 

์•„๋ž˜ ๋‘๊ฐ€์ง€ ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ–ˆ์„ ๋•Œ, ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๋‹จํ•ด ๋ณด์ด์‹œ๋‚˜์š”? (?) 

๋‹น์—ฐํžˆ ํ›„์ž๊ฒ ์ฃ . ์ด๋ ‡๊ฒŒ ๊ธด ์œ ๋‹ˆ์–ธ ํƒ€์ž…์„ ํƒ€์ž… ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ›จ์”ฌ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

let rawDataFirst: boolean | number | string | null | undefined;
let rawDataSecond: boolean | number | string | null | undefined;
let rawDataThird: boolean | number | string | null | undefined;
type RawData = boolean | number | string | null | undefined;

let rawDataFirst: RawData;
let rawDataSecond: RawData;
let rawDataThird: RawData;

 

 

ํƒ€์ž… ๋ณ„์นญ์€ ๊ฒฐํ•ฉ๋„ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋„ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 

type Id = number | string;

//IdMaybe์˜ ํƒ€์ž…์€ number | string | undeffined | null 
type IdMaybe = Id | undefined | null;

 

 

 

 

 

 

 

์ถœ์ฒ˜: ๋Ÿฌ๋‹ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ

'TIL > TypeScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ์ฒด  (2) 2023.12.07
ํƒ€์ž… ์‹œ์Šคํ…œ (Type System)  (1) 2023.12.01