Partial
為所有屬性添加?這個midfier,也就是設置所有屬性都是可選屬性。
interface Person{
name: string;
age: number;
}
type NewPerson = Partial<Person>;
const p: NewPerson = {
name: 'ashen';
};
// name和age都被設置成了可選屬性
Required
設置所有屬性都是必填的。
interface Person{
name: string;
age?: number;
}
type NewPerson = Required<Person>;
const p: NewPerson = {
name: 'ashen'; // error age被設置成了必填屬性
};
Record
設置給定的可能屬性,都對應給定類型的“key:value”形式
type r = Record<'a'|'b'|'c', Person>;
// 最終實現 {a: Person; b: Person; c: Person}
Pick
將某個類型中的子屬性挑選出來
type NewPerson = Pick<Person, 'name'>;
// NewPerson變成:{name: string}
Exclude
將某個類型中的子屬性剔除
interface Animal{
name: string;
age: number;
sex: string;
sayHi: () => string;
eat: string => void;
}
type Dog = Exclude<keyof Animal, 'sayHi'> // Dog類中包含除開sayHi的所有屬性
當我們需要對interface進行繼承時,如果像以下方式處理,會報錯
interface Chicken {
name: string;
age: number;
egg: number;
}
interface NewChicken extends Chicken {
name: number;
}
此時我們需要將不被overwrite的屬性提取出來,再進行繼承
interface NewChicken extends pick<Chicken, 'age'|'egg'>{
name: number;
}
但是如果需要提取的屬性很多,難道要一個個列舉出來嗎?此時可以通過Exclude將name屬性剔除,再傳入Pick進行選擇
interface NewChicken extends pick<Chicken, Exclude<keyof Chicken, 'name'>>{
name: number;
}
Omit
就是以上Pick和Exclude的結合
Parameters
得到函數參數類型組成的元祖類型
type A = Parameters<typeof Array.isArray> // [any]
type B = Parameters<typeof parseInt> // [number, (string | undefined)?]
ReturnType
得到函數返回值的類型
function testFunc(){
return 123;
}
type A = ReturnType<typeof testFunc>; // number