반응형
타입 넓히기(type widening)
타입 넓히기는 TypeScript의 타입 추론이 어떻게 동작하는지 이해하는 데 필요한 핵심 개념입니다.
TypeScript는 타입을 정밀하게 추론하기보다는 일반적으로 추론합니다. (덕분에 프로그래머의 삶이 편해집니다)
let이나 var로 값을 바꿀 수 있는 변수를 선언하면 그 변수의 타입이 리터럴 값에서 리터럴 값이 속한 기본 타입으로 넓혀집니다.
let a = 'x' // let a: string
let b = 2 // let b: number
var c = true // boolean
const d = { x: 4} // (property) x: number
enum E {A, B, C}
let e = E.A // let e: E
값을 바꿀 수 없는 변수에선 상황이 달라집니다.
const a = 'x' // const a: "x"
const b = 2 // const b: 2
const c = true // const c: true
enum E {A, B, C}
const e = E.A // const e: E.A
타입을 명시하면 타입이 넓어지지 않도록 막을 수 있습니다.
let a: 'x' = 'x' // let a: "x"
let b: 2 = 2 // let b: 2
var c: true = true // var c: true
const d: { x: 4 } = { x: 4 } // const d: { x: 4; }
let이나 var로 선언했고 타입이 넓어지지 않은 변수에 값을 다시 할당하면 TypeScript는 새로운 값에 맞게 변수의 타입을 넓힙니다.
변수를 선언할 때 명시적으로 어노테이션을 추가하면 이러한 자동 확장이 일어나지 않습니다.
const a = 'x' // const a: "x"
let b = a // let b: string
const c: 'x' = 'x' // const c: "x"
let d = c // let d: "x"
null이나 undefined로 초기화된 변수는 any 타입으로 넓혀집니다.
let a = null // let a: any
a = 3 // let a: any
a = 'b' // let a: any
null이나 undefined로 초기화된 변수가 선언 범위를 벗어나면 TypeScript는 좁은 타입을 할당합니다.
function x(){
let a = null // let a: any
a = 3 // let a: any
a = 'b' // let a: any
return a // let a: string
}
x() // function x(): string
const 타입
TypeScript는 타입이 넓혀지지 않도록 해주는 const라는 특별 타입을 제공합니다.
let a = {x: 2} // let a: { x: number;}
let b: {x: 2} // let b: { x: 2;}
let c = {x: 2} as const // let c: { readonly x: 2;}
const를 사용하면 타입 넓히기가 중지되며 멤버들까지 자동으로 readonly가 됩니다.
let d = [1, {x: 2}] // let d: (number | { x: number;})[]
let e = [1, {x: 2}] as const // let e: readonly [1, { readonly x: 2;}]
TypeScript가 변수를 가능한 한 좁은 타입으로 추론하길 원하면 as const를 이용하면 됩니다.
반응형
'👶 TypeScript' 카테고리의 다른 글
정제 (0) | 2023.01.19 |
---|---|
타입 넓히기 - 초과 프로퍼티 확인 (0) | 2023.01.18 |
할당성(assignability) (0) | 2023.01.18 |
함수 가변성 (0) | 2023.01.18 |
형태와 배열 가변성 (0) | 2023.01.18 |