- 타입스크립트에서 타입 좁히기는 변수 또는 표현식의 타입 범위를 더 작은 범위로 좁혀나가는 과정을 말한다. 타입 좁히기를 통해 더 정확하고 명시적인 타입 추론을 할 수 있게 되고, 복잡한 타입을 작은 범위로 축소하여 타입 안전성을 높일 수 있다.
- 타입 가드는 런타임에 조건문을 사용하여 타입을 검사하고 타입 범위를 좁혀주는 기능을 말한다.
typeof 연산자로 원시 타입 추론
typeof
는 자바스크립트 타입 시스템만 대응할 수 있다. 자바스크립트 동작 방식으로 인해null
과 배열 타입 등이object
타입으로 판별되는 등 복잡한 타입을 검증하기에는 한계가 있다. 따라서typeof
연산자는 주로 원시 타입을 좁히는 용도로 사용하는게 좋다.string
,number
,boolean
,undefined
,object
,function
,bigint
,symbol
를 검사할 수 있다.
const replaceHyphen: (date: string | Date) => string | Date = (date) => { if (typeof date === "string") { return date.replace(/-/g, '/'); } return date; }
instanceof 연산자로 인스턴스화된 객체 타입 판별
A instanceof B
형태로 사용하며 A에는 타입을 검사할 대상 변수, B에는 특정 객체의 생성자가 들어간다. A의 프로토타입 체인에 생성자 B가 존재하는지 검사하며true/false
를 반환한다.instanceof
연산자는 인스턴스화된 객체 타입을 판별하는 타입 가드로 사용할 수 있다.
interface Range { start: Date; end: Date; } interface DatePickerProps { selectedDates?: Date | Range; } function convertToRange(selected?: Date | Range): Range | undefined { return selected instanceof Date ? { start: selected, end: selected } as Range : selected; } const DatePicker = ({ selectedDates }: DatePickerProps) => { convertToRange(selectedDates) }
- 어떤 Element의 인스턴스인지 검사할 수도 있다.
const onKeyDown = (event: KeyboardEvent) => { if (event.target instanceof HTMLInputElement && event.key === 'Enter') { event.target.blur(); } }
in 연산자로 객체의 속성 여부 확인
A in B
형태로 사용하는데 이름 그대로 A라는 속성이 B 객체에 존재하는지를 검사하여true/false
를 반환한다. 프로토타입 체인으로 접근할 수 있는 속성이면 전부true
이다.- 주의할 점은 B 객체에 존재하는 A 속성에
undefined
를 할당한다고 해서false
를 반환하지 않는다.delete
연산자를 사용하여 객체 내부에서 해당 속성을 제거해야만false
를 반환한다. - 객체로 이루어진 유니온 타입이 있을 때
in
연산자를 통해 분기 처리해줄 수 있다.
interface BasicNoticeDialogProps { noticeTitle: string; noticeBody: string; } interface NoticeDialogWithCookieProps extends BasicNoticeDialogProps { cookieKey: string; noForADay?: boolean; neverAgain?: boolean; } type NoticeDialogProps = | BasicNoticeDialogProps | NoticeDialogWithCookieProps; const noticeDialog = (dialog: NoticeDialogProps) => { if ('cookieKey' in dialog) { return dialog.neverAgain; } return dialog.noticeTitle; }
is 연산자로 사용자 정의 타입 가드 만들기
- 반환 타입이 타입 명제인 함수를 정의하여 타입 가드로 사용할 수 있다.
- 타입 명제는
A is B
형식으로 작성한다. A는 매개변수 이름이고 B는 타입이다.boolean
을 반환하면서 반환 타입을 타입 명제로 지정하게 되면 반환 값이 참일 때 A 매개변수의 타입을 B 타입으로 취급한다. - 사용자 정의 타입 가드 함수를 통해 특정 타입으로 타입을 좁힐 수 있다.
const codeList = ['code1']; const arr: Code[] = []; type Code = `code${string}`; const isCode = (x: string): x is Code => codeList.includes(x); const fn = (code: string) => { if (isCode(code)) { arr.push(code); } }
'TypeScript' 카테고리의 다른 글
[TS] 조건부 타입 (0) | 2025.01.26 |
---|---|
[TS] 식별할 수 있는 유니온, Exhaustiveness Checking (1) | 2025.01.25 |
[TS] 타입 확장하기 (0) | 2025.01.23 |
[TS] 제네릭 사용법 (0) | 2025.01.22 |
[TS] 타입 조합 (0) | 2025.01.21 |