工具类型

TypeScript 提供了一系列工具类型,可以帮助我们构建复杂的类型操作和类型检查。

Partial 和 Required

Partial<T> :将 T 类型的所有属性变为可选属性。

Required<T>:将 T 类型的所有属性变为必需属性。

1//工具类型
2interface IObj {
3    a:string,
4    b?:boolean,
5    c?:number
6}
7
8//Partial<泛型>
9//<> 里面对象全部类型, 自动变成可缺省类型 
10let obj:Partial<IObj> = {
11    a:"11",
12    b:true,
13    c:11
14}
15
16// Required<>
17// <> 里面对象全部类型 , 自动变成不可缺省类型(?失效)
18let obj2:Required<IObj> = {
19    a:'11',
20    b:true,
21    c:10
22}

extends

extends 关键字用于条件类型,可以根据泛型参数 P 是否是 string 或 number 来决定最终类型,最终类型的确定由三元运算的结果决定。

1type TypeFn<P> = P extends string | number ? P[] : P;
2let m: TypeFn<number> = [1, 2, 3];
3let m1: TypeFn<string> = ['1', '2', '3'];
4let m2: TypeFn<boolean> = true;

infer

infer 用于条件类型中,允许声明一个类型变量,该变量代表检查表达式的类型。

1type ObjType<T> = T extends { name: infer N; age: infer A } ? [N, A] : [T];
2let p: ObjType<{ name: string; age: number }> = ["张三", 1];
3let p1: ObjType<{name: string}> = [{name: '张三'}];

keyof

keyof 提取对象的属性名、索引名、索引签名的类型。

1interface NumAndStr {
2  name: string;
3  age: number;
4  [key: number]: string | number;
5}
6type TypeKey = keyof NumAndStr; // number | 'name' | 'age'
7let t:TypeKey = 'name';

in

in 是映射类型,用于创建一个新类型,其键由一个联合类型中的每个成员组成,而值由另一个类型提供。

1type NumAndStr = number | string;
2type TargetType = {
3  [key in NumAndStr]: string | number;
4};
5
6let obj: TargetType = {
7    1: '123',
8    "name": 123
9}

注意:

  1. in 只能在类型别名定义中使用,不能在接口中使用。

  2. in 和 keyof 只能在类型别名定义中组合使用。

typeof

typeof 的主要用途是在类型上下文中获取变量或者属性的类型

1// 推断变量的类型
2let strA = "2";
3type KeyOfType = typeof strA; // string
4
5// 反推出对象的类型作为新的类型
6let person = {
7    name: '张三',
8    getName(name: string):void {
9        console.log(name);
10    }
11}
12type Person = typeof person;