Type Predicate (타입 술어)
- 타입 가드 역할을 하는 특별한 종류의 리턴 타입이다.
- 사용자 정의 타입 가드 함수에서 코드의 특정 영역에서 타입을 좁히기 위해 사용한다.
- 인자로 들어온 타입이 이런 타입이다 라고 알려줘서 타입 추론을 가능하게 만든다.
parameterName
is
Type
의 형태를 띈다.
코드 예시 1
function isString(value: any): value is string {
return typeof value === "string";
}
const mixedArray: any[] = [1, "hello", 2, "world"];
// isString() 을 거친 값들은 string 이라는 것을 `value is string` 이 말해주고 있다.
const stringArray: string[] = mixedArray.filter(isString); // `stringArray` 는 이제 `string[]` 타입
코드 예시 2
- 결국 Type Predicate 는 로직적인 부분을 바꾸는 것이 아니라
if
블록 내부의 타입 추론 결과를 바꾼다.
/**
* 숫자인지 아닌지 판별하는 함수.
* any 를 사용하기 아주 적절한 상황이다.
* @param {any} input
*/
function isNumber(input: any): input is number {
return typeof input === "number";
}
function isNumberReturnBool(input: any): boolean {
return typeof input === "number";
}
let number: any = 5;
// Type Predicate 사용하지 않음
if (isNumberReturnBool(number)) {
number; // any 타입, Type Predicate 를 사용하지 않아 타입 추론이 제대로 되지 않아서 아직 any 타입임.
}
// Type Pedicate 사용
if (isNumber(number)) {
number; // number 타입, Type Predicate 가 타입 추론을 도와 number 타입이 됨.
}
코드 예시 3
interface Company {
name: string;
location: string;
}
interface Person {
name: string;
address: string;
}
type CompanyOrPerson = Company | Person;
const companyOrPerson: CompanyOrPerson =
Math.random() > 0.5
? {
name: "Jake",
address: "Seoul",
}
: {
name: "Nexon",
location: "Pangyo",
};
function isCompany(v: CompanyOrPerson): v is Company {
return "location" in v;
}
if (isCompany(companyOrPerson)) {
companyOrPerson; // Company 타입
} else {
companyOrPerson; // Person 타입
}
반응형
'Typescript' 카테고리의 다른 글
TS016. 타입스크립트 타입, 인터페이스 상속과 오버라이딩 (0) | 2023.12.30 |
---|---|
TS015. 타입스크립트에서 타입과 인터페이스의 차이 (0) | 2023.12.30 |
TS013. 타입스크립트의 문장(statement)과 표현식(expression) (0) | 2023.12.28 |
TS012. 타입스크립트 함수 오버로딩 (0) | 2023.12.28 |
TS011. 타입스크립트로 함수 시그니처 선언하기 (0) | 2023.12.28 |