工具类型
打造自己的工具类型,这个时候需要用到一些物料
Partial 和 Required
tsx
//工具类型
interface IObj {
a:string,
b?:boolean,
c?:number
}
//Partial<泛型>
//<> 里面对象全部类型 , 自动变成 可缺省类型
let obj:Partial<IObj> = {
a:"11",
b:true,
c:11
}
// Required<>
// <> 里面对象全部类型 , 自动变成不可缺省类型 ?失效
let obj2:Required<IObj> = {
a:'11',
b:true,
c:10
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
extends
extends关键字判断泛型参数P是否是string或者是number其中的一种,最终类型的确定由三元运算的结果决定。
tsx
type TypeFn<P> = P extends string | number ? P[] : P;
let m: TypeFn<number> = [1, 2, 3];
let m1: TypeFn<string> = ['1', '2', '3'];
let m2: TypeFn<boolean> = true;
1
2
3
4
2
3
4
类型推断 infer
类型推断infer相当于声明一个变量接收传入的类型
tsx
type ObjType<T> = T extends { name: infer N; age: infer A } ? [N, A] : [T];
let p: ObjType<{ name: string; age: number }> = ["张三", 1];
let p1: ObjType<{name: string}> = [{name: '张三'}];
1
2
3
2
3
keyof
Keyof提取对象属性名、索引名、索引签名的类型;
tsx
interface NumAndStr {
name: string;
age: number;
[key: number]: string | number;
}
type TypeKey = keyof NumAndStr; // number | 'name' | 'age'
let t:TypeKey = 'name';
1
2
3
4
5
6
7
2
3
4
5
6
7
in
in是映射类型
tsx
type NumAndStr = number | string;
type TargetType = {
[key in NumAndStr]: string | number;
};
let obj: TargetType = {
1: '123',
"name": 123
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
注意:
- 我们只能在类型别名定义中使用 in,如果在接口(interface)中使用,则会提示一个错误
- in 和 keyof 也只能在类型别名定义中组合使用
typeof
typeof 的主要用途是在类型上下文中获取变量或者属性的类型
tsx
// 推断变量的类型
let strA = "2";
type KeyOfType = typeof strA; // string
// 反推出对象的类型作为新的类型
let person = {
name: '张三',
getName(name: string):void {
console.log(name);
}
}
type Person = typeof person;
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12