Conditional Types
제약 조건과 다르게 타입 구현 영역에서 사용하는 extends는 상함연산자를 사용이 가능하다!! 이른 조건부 타입이라고 한다
T extends U ? X : Y
이런식으로 사용한다
type IsString<T> = T extends string ? true : false;
type A = IsString<string>; // true
type B = IsString<number>; // false
타입구현 사용
type U = string | number | boolean;
type MyType<T> = T extends U ? true : false;
interface IUser<T> {
name: string
age: T extends U ? number : never
}
// `T`는 `boolean` 타입으로 제한.
interface IUser<T extends boolean> {
name: string,
age: T extends true ? string : number, // `T`의 타입이 `true`인 경우 `string` 반환, 아닌 경우 `number` 반환.
isString: T
}
const str: IUser<true> = {
name: 'Neo',
age: '12', // String
isString: true
}
const num: IUser<false> = {
name: 'Lewis',
age: 12, // Number
isString: false
}
// test
type NumberAndString = number | string
interface IdLabel {
id: number /* some fields */;
}
interface NameLabel {
name: string /* other fields */;
}
type NameOrId<T extends NumberAndString> = T extends number ? IdLabel : NameLabel;
function createLabel<T extends NumberAndString>(idOrName: T): NameOrId<T> {
throw "unimplemented";
}
let a = createLabel(1)
let b = createLabel("typescript")
let c = createLabel(Math.random() ? "hello" : 42)