通过条件类型, ts 实现了一些常见的内置类型
- Extract(叉集抽离)语法
Extract<类型1,类型2>,返回值两个类型的交集
type Conditional = Extract<string | number | boolean, string | number> // string | number
// 实现:
type MyExtract<T, U> = T extends U ? T : never // 和 never 的联合类型是类型本身
type Conditional = MyExtract<string | number | boolean, string | number> // string | number
- Exclude 排除类型
type condition = Exclude<1 | 2 | 3 | 4 | 5, 1 | 2> // 3 | 4 | 5
type MyExclude<T, U> = T extends U ? never : T
type condition = MyExclude<1 | 2 | 3 | 4 | 5, 1 | 2> // 3 | 4 | 5
- NonNullable 取非空类型
type condition = NonNullable<1 | 2 | null | undefined> // 1 | 2
type NonNullable<T> = T extends null | undefined ? never : T
- 获取函数类型和返回值类型
function getObj(name:string,age:number) {
return {
name,age
}
}
type Ifn = typeof getObj
/**
* (name: string, age: number) => {
name: string;
age: number;
}
*/
type Ireturn = ReturnType<typeof getObj> // {name: string; age: number;}
- 获取参数类型
function getObj(name: string, age: number) {
return { name, age }
}
type R1 = Parameters<typeof getObj> // [name: string, age: number]
- 两个接口合并
interface Person1 {
handsome: boolean
}
interface Person2 {
high: string
}
type Computed<T extends object> = { [K in keyof T]: T[K] }
type Person3 = Computed<Person1 & Person2>
- 接口中的属性都变成可选
interface Person{
age:number
name:string
}
type PartialRes = Partial<Person>
/*
type PartialRes = {
age?: number | undefined;
name?: string | undefined;
}
*/
实现:
interface Person{
age:number
name:string
}
type MyPartial<T> = {
[P in keyof T]?:T[P]
}