Partial
Partial的用处如以下举例:当接口中的属性在有些情况下是可选参数的,有些情况下是必选参数。Partial拿出部分属性的属性,作用把泛型的类型(<>尖括号的接口类型)属性设置属性为可选参数。
js
// 定义两个接口满足以上要求
interface Pt1{
name:string;
age:number;
}
interface Pt2{
name?:string;
age?:number;
}
js
//采用Partial,只需要定义一个接口
interface People {
name:string;
age:number;
}
// 泛型放入接口的类型
let peopleObj:Partial<People>={
name:"jessica",
age:418
}
let people:Partial<People>={
name:"hyo",
}
let people2:Partial<People>={
name:Gloria,
age:undefined
}
type Partial<T> = { [P in keyof T]?: T[P] | undefined; }
这段代码的含义为T
这个泛型在使用时就是传入的接口的类型,将来这个类型依然是一个对象。P in keyof T
就是遍历接口中的属性,P
相当于一个临时变量用于保存遍历出的接口属性name
和age
;T[P]
表示取出接口中属性的属性值就是string
和number
。即这段代码最终呈现结果为一个对象:
js
// 问号表示可选属性
{
name?:string|undefined,
age?:number|undefined
}
Required
Required的用处如以下举例:当接口中的属性有可选参数,但有些情况下需要这个可选参数是必选参数。Required的作用是把泛型的类型(<>尖括号的接口类型)属性设置属性为必选参数。
js
interface People {
name:string;
age:number;
height?:number
}
// 泛型放入接口的类型
let peopleObj:Required<People>={
// 编译报错
name:"jessica",
age:418
}
type Required<T> = { [P in keyof T]-?: T[P]; }
这段代码的含义为T
这个泛型在使用时就是传入的接口的类型,将来这个类型依然是一个对象。P in keyof T
就是遍历接口中的属性,P
相当于一个临时变量用于保存遍历出的接口属性name
和age
和height
;T[P]
表示取出接口中属性的属性值就是string
和number
和number
;-?
表示抵消去掉问号,有问号就减去问号,没有就不需要减去。即这段代码最终呈现结果为一个对象:
js
// 问号表示可选属性
{
name:string|undefined,
age:number|undefined,
height:number|undefined,
}