Open huruji opened 5 years ago
将泛型 T 的所有属性变为可选:
T
实现为:
type Partial<T> = { [P in keyof T]?: T[P]; };
例子:
interface IGoods { sku: string name: string price: number } let book:Partial<IGoods> = { sku: 'abcd', name: 'huruji' } book.price = await getPrice(book.sku)
我们可以拓展一下,支持深层次的 partial
type DeepPartial<T> = { [P in keyof T]?: T[P] extends Array<infer U> ? Array<DeepPartial<U>> : T[P] extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>> : DeepPartial<T[P]> }
interface IUser { user: { name: string, id: number } } let huruji:DeepPartial<IUser> = { user: { name: 'huruji' } }
将泛型 T 的所有属性变为只可读(readonly):
type Readonly<T> = { readonly [P in keyof T]: T[P]; };
function freeze<T>(obj:T):Readonly<T> { return obj } const user = freeze({ name: 'huruji', age: 12 })
规定 key 的type
type Record<K extends keyof any, T> = { [P in K]: T; };
type GoodProps = 'sku' | 'id' | 'name' let iphone:Record<GoodProps, string> = { sku: 'f', id: 'a', name: 'd' }
等同于定义的 interface:
interface IGoods { sku: string id: string name: string }
选取 T 的部分属性组成新的 type
type Pick<T, K extends keyof T> = { [P in K]: T[P]; };
interface IGoods { sku: string id: string name: string } let airpod:Pick<IGoods, 'sku' | 'name'> = { sku: 'sdf', name: 'air' }
从类型 T 中忽略 K 属性,组成新的类型
K
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
例子: pick 的例子等价于
interface IGoods { sku: string id: string name: string } let airpod:Omit<IGoods, 'id'> = { sku: 'sdf', name: 'air' }
排除部分 T 的属性(Constructs a type by excluding from T all properties that are assignable to U.)
实现:
type Exclude<T, U> = T extends U ? never : T;
type GoodProps = 'sku' | 'id' | 'name' type SubGoods = Exclude<GoodProps, 'name'> let desk:Record<SubGoods, string> = { sku: '123', id: '456' }
T 和 U 取交集组成新的类型
type Extract<T, U> = T extends U ? T : never;
例子
type GoodProps = 'sku' | 'id' | 'name' type People = 'age' | 'name' let ex:Extract<GoodProps, People> = 'name'
从 T 中排除 null 和 undefind 类型
type NonNullable<T> = T extends null | undefined ? never : T;
type Age = number | undefined | null let userAge:NonNullable<Age> = 12
获得函数类型 T 的返回类型
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;
type T0 = ReturnType<() => string> let name:T0 = 'huruji'
将 T 中所有可选属性转换为必须属性,是 Partial 的反操作
Partial
将泛型
T
的所有属性变为可选:实现为:
例子:
我们可以拓展一下,支持深层次的 partial
Readonly
将泛型
T
的所有属性变为只可读(readonly):实现为:
例子:
Record<K, T>
规定 key 的type
实现为:
例子:
等同于定义的 interface:
Pick<T,K>
选取 T 的部分属性组成新的 type
实现为:
例子:
Omit<T, K>
从类型
T
中忽略K
属性,组成新的类型实现为:
例子: pick 的例子等价于
Exclude<T,U>
排除部分 T 的属性(Constructs a type by excluding from T all properties that are assignable to U.)
实现:
例子:
Extract<T, U>
T 和 U 取交集组成新的类型
实现:
例子
NonNullable
从 T 中排除 null 和 undefind 类型
实现:
例子:
ReturnType
获得函数类型
T
的返回类型实现:
例子:
Required
将 T 中所有可选属性转换为必须属性,是 Partial 的反操作