泛型工具类型
typeof
interface Person {
name: string;
age: number;
}
const sem: Person = { name: 'semlinker', age: 33 };
type Sem= typeof sem; // -> Person
function toArray(x: number): Array<number> {
return [x];
}
type Func = typeof toArray; // -> (x: number) => number[]
keyof
操作符可以用于获取某种类型的所有键,其返回类型是联合类型。
interface Person {
name: string;
age: number;
}
type K1 = keyof Person; // "name" | "age"
type K2 = keyof Person[]; // "length" | "toString" | "pop" | "push" | "concat" | "join"
type K3 = keyof { [x: string]: Person }; // string | number
in
in 用来遍历枚举类型
type Keys = "a" | "b" | "c"
type Obj = {
[p in Keys]: any
} // -> { a: any, b: any, c: any }
infer
https://segmentfault.com/a/1190000018514540?utm_source=tag-newest
在extends语句中,还支持infer关键字,可以推断一个类型变量,高效的对类型进行模式匹配。但是,这个类型变量只能在true的分支中使用。
infer X 就相当于声明了一个变量,这个变量随后可以使用,在extends里用于去匹配赋值的类型。
infer 最早出现在此 PR 中,表示在 extends 条件语句中待推断的类型变量。
// infer P 表示待推断的函数参数。
type ParamType<T> = T extends (param: infer P) => any ? P : T;
如果 T 能赋值给 (param: infer P) => any,则结果是 (param: infer P) => any 类型中的参数 P,否则返回为 T。
interface User {
name: string;
age: number;
}
type Func = (user: User) => void
type Param = ParamType<Func>; // Param = User
type AA = ParamType<string>; // string
内置类型ReturnType就是用infer实现的
type ReturnType<T> = T extends (...args: any[]) => infer P ? P : any;
ReturnType<T>
只是将 infer P 从参数位置移动到返回值位置,因此此时 P 即是表示待推断的返回值类型。
type Func = () => User;
type Test = ReturnType<Func>; // Test = User