根据不同的条件返回对应的类型
type A<T> = T extends XX ? B : C;
可以类比 js 的三元操作符
const A = perdicate ? B : C;
报错, 因为不确定 T 中是否存在 message
type MessageOf<T> = T["message"];
可以入参的时候做约束
例子:
type MessageOf<T extends { message: unknown }> = T["message"];
interface Email {
message: string;
}
interface Dog {
bark(): void;
}
type EmailMessageContents = MessageOf<Email>;
如果希望 MessageOf 接受任何参数, 在 T 没有 message 的情况下做返回默认的值 never, 又该如何处理呢?
在入参的时候不做限制, 把判断移动到条件类型语句中
type MessageOf<T> = T extends { message: unknown } ? T["message"] : never;
interface Email {
message: string;
}
interface Dog {
bark(): void;
}
type EmailMessageContents = MessageOf<Email>;
type EmailMessageContents = string;
type DogMessageContents = MessageOf<Dog>;
另外一个数组拍平(flattern)的例子
type Flattern<T> = T extends any[] ? T[number] : T;
type Str = Flatten<string[]>;
type Num = Flatten<number>;
在约束条件内声明临时的变量, 然后再结果中使用
type Flattern<T> = T extends Array<infer Item> ? Item : T;
另一个 GetReturnType 的例子
type GetReturnType<Type> = T extends (..args: never[])=> infer Result ? Result : never
type ToArray<Type> = Type extends any ? Type[] : never;
type StrArrOrNumArr = ToArray<string | number>; // type StrArrOrNumArr = string[] | number[]