타입 좁히기(Narrowing)는 선언된 넓은 타입(유니언, unknown)을 실행 경로를 따라 더 구체적인 타입으로 줄여 가는 과정이다. 그 근거가 되는 런타임 검사를 타입 가드(Type Guard)라고 한다.
function f(x: string | number | Date | null) {
if (typeof x === 'string') x.toUpperCase() // typeof
else if (x instanceof Date) x.getTime() // instanceof (클래스만 가능)
else if (x) x.toFixed() // truthiness: null 제거
}
if ('swim' in animal) animal.swim() // in: 속성 유무로 객체 유니언 구분typeof null은'object'다. null 검사를 따로 한다- truthiness 좁히기는
0,'',NaN도 걸러 버리니 숫자·문자열에는 조심한다(옵셔널 체이닝과 null 병합 연산자) - interface는 런타임에 없어서
instanceof를 쓸 수 없다. 이때in이나 구분 필드를 쓴다 - 할당도 좁히기다.
let x: string | number = 1다음 줄에서 x는number로 취급된다
사용자 정의 타입 가드 (User-Defined Type Guard, is)
function isSection(item: PageItem): item is SectionItem {
return item.type === 'section'
}
items.filter(isSection) // SectionItem[]로 좁혀짐
items.filter(i => i.type === 'section') // TS 5.4 이하는 PageItem[] 그대로(5.5부터는 가드로 추론되기도 한다)함수가 true를 반환하면 그 인자를 해당 타입으로 믿게 하는 문법이다. 검사 내용이 틀려도 컴파일러는 믿으므로 가드 함수는 작고 정확하게 쓴다. 외부 데이터를 unknown으로 받아 좁히는 흐름은 any와 unknown, 구분 필드로 자동 좁히기는 판별 유니언, 같은 구조를 다르게 다루는 방법은 타입 브랜딩 참고. 좁히기를 조기 반환으로 읽기 쉽게 쓰는 방법은 보호 구문.