์ƒˆ์†Œ์‹

FrontEnd/TypeScript

[TypeScript] Narrowing ๊ณผ Assertion

  • -

๐Ÿฃ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—!


์ด๋ฒˆ์—๋Š” Narrowing & Assertion์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๋‹ค. ํ˜น์‹œ ์ง€์ง€๋‚œ ๊ฒŒ์‹œ๋ฌผ์—์„œ ๋‹ค๋ค˜๋˜ union type์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ๋˜ ๋ถ€๋ถ„๋“ค์„ ๊ธฐ์–ต ํ•˜๋Š”์ง€?!?! ๋Œ€๋žต ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ์˜€๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ๋ฟœ๋ฟœํ•œ ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฒ•์„ ์ง€๊ธˆ๋ถ€ํ„ฐ ์•Œ์•„๊ฐ€๋ณด๋„๋ก ํ•˜๊ฒ ๋”ฐ!

let ๊ณ„์‚ฐ: string | number
๊ณ„์‚ฐ + 1; //error

 

 

union type์— ๋Œ€ํ•ด์„œ ๊ธฐ์–ต์ด ์ž˜ ์•ˆ๋‚œ๋‹ค๋ฉด ์ฐธ๊ณ !
 

[TypeScript] union type · any · unknown

๐Ÿฃ union type · any · unknown ๊ณตํ†ต์ ์ด๋ž„๊นŒ?๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ์ด ์„ธ๊ฐ€์ง€์˜ ๊ณตํ†ต์ ์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด! ์–ด๋–ค ํƒ€์ž…์˜ ์ข…๋ฅ˜๊ฐ€ ๋“ค์–ด์˜ฌ์ง€ ํ™•์‹คํ•˜๊ฒŒ ๋ชจ๋ฅผ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์„ ๋“ค ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์‚ฌ์šฉํ• 

haileyham.tistory.com

๋ฐ”๋กœ ์ „ ๊ฒŒ์‹œ๋ฌผ์€ void type์— ๋Œ€ํ•œ ์ •๋ฆฌ ๊ธ€!_!
 

[TypeScript] void type

๐Ÿฃ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—์ด๋ฒˆ์—๋Š” void type์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด์žฅ!_! void ํƒ€์ž…์€ ํ•จ์ˆ˜์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. 'void'์˜ ๊ฒฝ์šฐ ๊ฐ’์ด ์—†์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ, ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”(=return

haileyham.tistory.com

 

 

๐Ÿฃ Type Narrowing


1. ๊ฐœ๋…

Type์ด ์•„์ง ํ•˜๋‚˜๋กœ ํ™•์ •๋˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ ์‚ฌ์šฉ. ์œ ํ˜• ๊ฐ€๋“œ(๋ณดํ˜ธ) ๋˜๋Š” ์ œ์–ด ํ๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋ฒ”์œ„ ๋‚ด์—์„œ ๋ณ€์ˆ˜ ์œ ํ˜•์„ ๊ตฌ์ฒดํ™”ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค. ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” typeof ์—ฐ์‚ฐ์ž.

์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด if ๋ฌธ ๋“ฑ์œผ๋กœ ํƒ€์ž…์„ ํ•˜๋‚˜๋กœ ์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ๋งํ•จ. 

 

if ๋ฌธ๊ณผ typeof ํ‚ค์›Œ๋“œ๋กœ ํ˜„์žฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•˜์—ฌ ์ง€์ •.

* ์ฐธ๊ณ ๋กœ typeof ์™ธ์—๋„ ํƒ€์ž…์„ ๊ตฌ์ฒดํ™” ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉด ๋‹ค ์‚ฌ์šฉ๊ฐ€๋Šฅ (in, instanceof)

 

2. ์ฝ”๋“œ๋กœ ๋” ์‚ดํŽด๋ณด๊ธฐ

์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” if ๋ฌธ๊ณผ typeof ํ‚ค์›Œ๋“œ๋กœ ํ˜„์žฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•˜์—ฌ ์ง€์ •.

function process(value: number | string) {
    if (typeof value === "string") {
        console.log(value.toUpperCase()); // ์—ฌ๊ธฐ์„œ value๋Š” ๋ฌธ์ž์—ด๋กœ ์ฒ˜๋ฆฌ
    } else {
        console.log(value.toFixed(2)); // ์—ฌ๊ธฐ์„œ value๋Š” ์ˆซ์ž๋กœ ์ฒ˜๋ฆฌ
    }
}

 

๐Ÿฃ Type Assertion


1. ๊ฐœ๋…

ํƒ€์ž… ๋ฎ์–ด์“ฐ๊ธฐ๋ผ๊ณ  ์ƒ๊ฐ. TypeScript๋ณด๋‹ค ์œ ํ˜•์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ TypeScript์— ๋ณ€์ˆ˜์˜ ํŠน์ • ์œ ํ˜•์„ ์•Œ๋ฆด ์ˆ˜ ์žˆ์Œ. as ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์™„๋ฃŒ!

์–ด๋–ค ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ (์˜ˆ์‹œ) string ํƒ€์ž…์œผ๋กœ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ. 

์™ผ์ชฝ์— ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ type์œผ๋กœ ๋ฎ์–ด์“ฐ๊ธฐ (ex) x as number : x๋ณ€์ˆ˜๋ฅผ number๋กœ ๋ฎ๋ฎ)

๋ณ€์ˆ˜๋ช… as string // ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋จ

 

 

์–ด๋–จ ๋•Œ ์‚ฌ์šฉ?

1. Narrowing ํ•  ๋•Œ ์‚ฌ์šฉ
2. ๋ฌด์Šจ ํƒ€์ž…์ด ๋“ค์–ด์˜ฌ์ง€ 100% ํ™•์‹คํ•  ๋•Œ ์‚ฌ์šฉ

 

2. ์ฝ”๋“œ๋กœ ๋” ์‚ดํŽด๋ณด๊ธฐ

์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด 'value'๋Š” 'string'์œผ๋กœ assertion ๋˜๋ฏ€๋กœ ํ•ด๋‹น 'length' ์†์„ฑ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ

let value: unknown = "Hello";
let strLength: number = (value as string).length; // value๊ฐ€ ๋ฌธ์ž์—ด์ž„์„ ๋‹จ์–ธ

---------------------------------

function ํ•จ์ˆ˜(x : number|string) {
    let array: number[] = []
    array[0] = x as number; // x๋ฅผ number๋กœ ์ธ์‹
}
ํ•จ์ˆ˜(123)

---------------------------------

//์ฐธ๊ณ 
(์ด๋ฆ„ as string) + 1;  //ํ˜„์žฌ๋ฌธ๋ฒ•
<string>์ด๋ฆ„ + 1;   //์˜›๋‚ ๋ฌธ๋ฒ•

---------------------------------

// ๊บพ์‡  ๊ด„ํ˜ธ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์˜ˆ
let someValue: any = "I am a string";
let strLength2: number = (<string>someValue).length;

 

 

๐Ÿฃ ๊ทธ๋ ‡๋‹ค๋ฉด ์ฒ˜์Œ์˜ ๊ถ๊ธˆ์ฆ์€ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐ?


์ฒ˜์Œ union type ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋˜ ๊ฒƒ์„ ํ•ด๊ฒฐ๋ฟœ ํ•˜๋ ค๋ฉด

function ๋‚ดํ•จ์ˆ˜(x :number | string){
    return (x as number) + 1
}

console.log( ๋‚ดํ•จ์ˆ˜(123) )

 

 

 

๐Ÿฃ ๋” ๋‚˜์•„๊ฐ€๋ณด๊ธฐ!_!


๋งŒ์•ฝ์— array๊ฐ€ ๋“ค์–ด์˜ค๋Š”๋ฐ [1, '2', 3] ์ด๋Ÿฐ์‹์œผ๋กœ ๋˜์–ด์žˆ์–ด์„œ, ์ „๋ถ€ ์ˆซ์ž ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?

function ๋ฟœ๋ฟœ(x: (number|string)[]) {
    let ์ˆซ์ž: number[] = [];
    
    x.forEach((a) => {
        if (typeof a === 'string') {
            ์ˆซ์ž.push(parseFloat(a))
        } else {
            ์ˆซ์ž.push(a)
        }
        
    })
    return ์ˆซ์ž;
}
console.log(๋ฟœ๋ฟœ([123,'1']));

 

ํ˜น์—ฌ parseFloat์— ๋Œ€ํ•ด ๊ถ๊ธˆํ•˜๋‹ค๋ฉด
 

Number(), parseInt(), parseFloat() ์ฐจ์ด์ ๊ณผ ๊ณตํ†ต์ [JavaScript]

Number()๋ฌธ์ž์—ด์˜ ์ˆ˜๋ฅผ ์ˆซ์ž๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.๋งŒ์•ฝ ์ธ์ˆ˜๋ฅผ ํ˜•๋ณ€ํ™˜ ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด NaN์„ ๋ฆฌํ„ดํ•œ๋‹ค.parseInt()๋ฌธ์ž์—ด ์ธ์ž(์ˆซ์ž + ๋ฌธ์ž)๋ฅผ ๋ฐ›๋Š”๋‹ค.๊ทธ ์ธ์ž๋ฅผ parse(ํ•ด๋ถ€ํ•˜๋‹ค, ํ’ˆ์‚ฌ๋ฌธ๋ฒ•์  ๊ด€๊ณ„๋ฅผ ์„ค๋ช…ํ•˜๋‹ค)ํ•œ๋‹ค.int

velog.io

 

 

๐Ÿฃ ์ฐธ๊ณ 


๋งŒ์•ฝ HTML ์—์„œ narrowing์„ ํ•œ๋‹ค๋ฉด?

1. if
2. instanceof ์—ฐ์‚ฐ์ž (๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ)
3. as
4. ?. (optional chaining)
5. tsconfig.json ์˜ strict false ์ฒ˜๋ฆฌ(ํƒ€์ž…์„ ์“ธ ์ด์œ ๊ฐ€ ์—†์Œ)

 

* ์ฐธ๊ณ ๋กœ optional chaining์˜ ๊ฒฝ์šฐ ์žˆ์œผ๋ฉด ์ถœ๋ ฅ, ์•„๋‹ˆ๋ฉด undefined
// [1]
if (ํƒ€์ดํ‹€ != null) {
    ํƒ€์ดํ‹€.innerHTML = "๋ฐ˜๊ฐ€์›Œ์šฉ"
}

// [2]
if (ํƒ€์ดํ‹€ instanceof Element) {//HTML์ด Element๋กœ ์˜ค๋Š” ๊ฒƒ์ธ์ง€ ํ™•์ธ > true๋กœ ๋ณผ๋ก๋ฌธ ์‹คํ–‰
    // ์ถ”ํ›„ class์—์„œ object๊ฐ€ class์˜ ์ž์‹, instance์ธ์ง€๋ฅผ ํ™•์ธ
    ํƒ€์ดํ‹€.innerHTML = "๋ฐ˜๊ฐ€์›Œ์šฉ"
}

// [3]
let ํƒ€์ดํ‹€1 = document.querySelector("#title123์ž˜๋ชป์ž…๋ ฅ") as Element;
// as ํ‚ค์›Œ๋“œ ์‚ฌ์šฉํ•ด์„œ id ๊ฐ’ ์ž…๋ ฅ ์ž˜๋ชปํ•ด๋„ Element๋กœ ํƒ€์ž…์ง€์ •

// [4]
if (ํƒ€์ดํ‹€?.innerHTML != undefined) {
    ํƒ€์ดํ‹€.innerHTML = "๋ฐ˜๊ฐ€์›ก"
}
// ์˜ค๋ธŒ์ ํŠธ์— ๋ถ™์ด๋Š” ?.
//1. ํƒ€์ดํ‹€์— innerHTML์ด ์žˆ์œผ๋ฉด ์ถœ๋ ฅ
//2. ์—†์œผ๋ฉด undefined

 

 



๋ง‰์ƒ ๋‚ด๊ฐ€ as ์“ธ ๋•Œ๋Š” ์˜ค์ง ์˜ค๋ฅ˜๋ฅผ ์ž„์‹œ ํ•ด๊ฒฐํ•  ๋•Œ...@_@

 

 

[TypeScript] ๊ฐ์ฒด์˜ ํƒ€์ž…๊ณผ readonly

๐Ÿฃ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—!๊ฐ์ฒด์—๋„ ํƒ€์ž…์ด ์กด์žฌํ•œ๋‹ค!_! ๋‹น์—ฐํ•œ ์‚ฌ์‹ค..! ๋šœ๋‘ฅ! ๊ทธ๋Ÿฌ๋ฉด ์ด๋ฒˆ์—๋Š” ๊ฐ์ฒด์˜ ํƒ€์ž…๊ณผ readonly์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด์ž!_! ๊ฐ„๋‹จํ•˜๋‹ˆ ์งง์€ ๊ธ€์ด ๋˜๊ฒ ๋”ฐ!  ํ˜น์‹œ ์ง€๋‚œ ๊ฒŒ์‹œ๋ฌผ์ด ๊ถ๊ธˆํ•˜๋‹ค๋ฉด

haileyham.tistory.com

 

Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.