๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Typescript

[Typescript] Type Narrowing

by mtm1018 2025. 7. 6.

๐Ÿ“• Narrowing

Narrowing์€ ๊ฐ’์˜ ํƒ€์ž…์ด ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ํŒ๋‹จ ๋  ์ˆ˜ ์žˆ๋Š”๊ฒฝ์šฐ

 

ํƒ€์ž…์„ ๋” ์ขํ˜€์„œ ๊ตฌ์ฒด์ ์œผ๋กœ ์ถ”๋ก  ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ค ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ a๊ฐ€ string | number ๊ฐ™์€ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์ผ ๋•Œ

 

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜๋Š” a.toLowerCase()๊ฐ™์€๊ฑด ์‹คํ–‰ํ•ด ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

๊ทธ ์ด์œ ๋Š”, a์— ์–ด๋–ค ํƒ€์ž…์ด ์˜ฌ์ง€ ์•„์ง ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค

 

์ด๋Ÿฐ๊ฒฝ์šฐ Narrowing์„ ํ†ตํ•ด์„œ ๊ตฌ์ฒด์ ์œผ๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—๊ฒŒ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค


๐Ÿ›ก๏ธ Type Guards

 

๊ทธ๋Ÿผ ์ด์ œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๋ฉด์„œ a์— ์–ด๋–ป๊ฒŒ Narrowing์„ ํ• ์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค.

function fn(a : string | number):string{
    if(typeof a === 'string'){
        return a.toUpperCase()
        }
    return a.toLocaleString()  
}

fn('gg')

 

์‚ฌ์‹ค ํƒ€์ž… ๊ฐ€๋“œ๋ผ๋Š”๊ฒŒ ๋ญ”๊ฐ€ ํŠน๋ณ„ํ•œ๊ฒŒ ์žˆ๋‹ค๊ธฐ๋ณด๋‹ค๋Š” typeof ์—ฐ์‚ฐ์ž์™€ ์กฐ๊ฑด๋ฌธ์„ ํ†ตํ•˜์—ฌ ์˜ˆ์™ธ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

์œ„ ์ฝ”๋“œ์—์„œ๋Š” if๋ฌธ์„ ํ†ตํ•ด string์ธ์ง€ ๊ฒ€์‚ฌํ•ด์ฃผ๊ณ  ์กฐ๊ฑด๋ฌธ ์™ธ์˜ ๋ธ”๋ก์—์„œ ์ž๋™์œผ๋กœ numberํ˜•์ธ์ง€ ๊ฒ€์‚ฌํ•ด์ค๋‹ˆ๋‹ค.

 

๋‹จ, typeof์—ฐ์‚ฐ์ž๋Š” ์›์‹œํƒ€์ž…์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

typeof a === 'object' ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ธด ํ•œ๋ฐ ๊ฐ์ฒด์˜ ์„ธ๋ถ€ ํ”„๋กœํผํ‹ฐ๊นŒ์ง€ ํƒ€์ž…์ด ์ขํ˜€์ง€์ง€๋Š” ์•Š๊ธฐ ๋•Œ๋ฌธ์—

 

typeof ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์˜ ํƒ€์ž…๊ฐ€๋“œ๋Š” ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


๐Ÿ› ๏ธ Narrowing์˜ ๊ธฐ์ˆ 

๊ทธ๋Ÿฐ๋ฐ ์‹ค์ œ๋กœ Narrowing์„ ํ•˜๋‹ค๋ณด๋ฉด ์›ํ•˜๋Š”๋Œ€๋กœ ๊น”๋”ํ•˜๊ฒŒ Narrowing๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ

 

์ƒ๊ฐ์น˜๋„ ๋ชปํ•œ ์—๋Ÿฌ๊ฐ€ ํ„ฐ์ง€๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ ์—๋Ÿฌ๋“ค์„ ๋ง‰์•„์ฃผ๋Š” ๋ช‡๊ฐ€์ง€ ์Šคํ‚ฌ๋“ค์„ ํ™•์ธํ•ด๋ด…์‹œ๋‹ค.

 
 
null ๊ณผ undefined๋ฅผ ๊ฑธ๋Ÿฌ๋‚ด๊ธฐ

&&์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ๊ฑธ๋Ÿฌ๋‚ด๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

&&์—ฐ์‚ฐ์ž์˜ ๊ฒฝ์šฐ falsyํ•œ ๊ฐ’์ด ์žˆ์œผ๋ฉด ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ ๊ฒฐ๊ณผ ์กฐ๊ฑด๋ฌธ์•ˆ์—์„œ ์‚ฌ์šฉ๋ ๊ฒฝ์šฐ falsy๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์กฐ๊ฑด๋ฌธ ์‹คํ–‰์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

function fn(a: string | null){
    if(a && typeof a === 'string'){
        console.log(a)
        }
        else{
        return
        }
}

 

์œ„ ์ฝ”๋“œ์—์„œ a๊ฐ€ ๋งŒ์•ฝ null์ด๋ผ๋ฉด a && typeof a === 'string' falsyํ•œ ๊ฐ’์ด๋ฏ€๋กœ ์กฐ๊ฑด๋ฌธ์ด ์‹คํ–‰๋˜์ง€ ์•Š์•˜์„ ๊ฒ๋‹ˆ๋‹ค.

in๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ Narrowing

๊ฐ์ฒด์•ˆ์— ์ง„์งœ ๊ทธ ํ‚ค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” in๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๊ฒƒ์œผ๋กœ ํŠน์ • ํ‚ค๊ฐ€ ์žˆ๋Š” ๊ฐ์ฒด๋งŒ ์ขํ˜€์ค„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

type Fish = { swim : () => void }
type Bird = [ fly : () => void }

function fn( a: FIsh | Bird ){
    if('swim' in a){
        a.swim()
    }
    else{
        a.fly()
    }
}

intanceof๋ฅผ ์ด์šฉํ•œ Narrowing

Date๋‚˜ Math๊ฐ™์€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ Narrowing ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

instanceof๋Š” ํด๋ž˜์Šค๊ธฐ๋ฐ˜์˜ ํƒ€์ž…๋งŒ ๊ฒ€์‚ฌํ•˜๋ฏ€๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ type์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

์ •๋ง๋กœ Class๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ผ๋ฉด, ์ƒ์†์ž๊นŒ์ง€๋„ ๊ฒ€์‚ฌํ•ด ์ค๋‹ˆ๋‹ค.

function fn (a : Date | string){
    if(a instanceof Date){
        a.getFullYear()
    }else{
        a.toUpperCase()
    }
}

โš ๏ธ never type

ํ•จ์ˆ˜๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ํƒ€์ž… ์ค‘ neverํƒ€์ž…์ด๋ž€๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

never๋ผ๋Š” ํƒ€์ž…์€ ๋“ฑ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์ด ์žˆ๋Š”๋ฐ์š”

  1. ๋ฐ˜ํ™˜๊ฐ’์ด ์—†์–ด์•ผํ•จ
  2. ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰์ด ๋๋‚˜์ง€ ์•Š์•„์•ผํ•จ.

๋А๋‚Œ์ƒ void๋ž‘ ๊ฒน์น˜๋Š” ๋А๋‚Œ์ธ๋ฐ ์™œ never๊ฐ€ ๋”ฐ๋กœ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์•Œ์•„๋ณด์ž๋ฉด,

 

๋ชจ๋“  ํ•จ์ˆ˜๋Š” undefined๋ฅผ returnํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— void๋„ ์‹ค์€ undefined๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒƒ์ธ๋ฐ,

 

never๋Š” ์ ˆ๋Œ€ ๊ทธ๋Ÿด์ผ์ด์—†๋Š” ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

const fn = () =>{
    throw new Error()
} // never

function fn(a:string){
    if(typeof a === 'string')
    console.log(a)
    }else{
    console.log(a)
    }
}

function fn(){
    while(true){ ... }
}

 

์œ„ ์˜ˆ์‹œ์—์„œ ๋ณด์ด๋“ฏ neverํƒ€์ž…์€ ๋‚ด๊ฐ€ ์ง์ ‘ ์ง€์ •ํ•  ์ผ์ด ์—†์ง€๋งŒ,

 

์ข…์ข… ์ฝ”๋“œ๋ฅผ ์œ„์™€๊ฐ™์ด ์ด์ƒํ•˜๊ฒŒ ์ ์—ˆ์„ ๋•Œ ์ถœํ˜„ํ•ฉ๋‹ˆ๋‹ค.

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

[TypeScript] Type ์š”์•ฝ  (0) 2025.07.06
[Typescript] generic  (0) 2025.07.01
[Typescript] keyof & typeof ์—ฐ์‚ฐ์ž  (1) 2025.07.01
[Typescript] ๋ฐฐ์—ด  (0) 2025.06.30
[Typescript] Object  (0) 2025.06.14