初篇
熟悉泛型函数基本开发了吗?
是的
进阶
Pick<ObjType, Keys> 泛型函数?
关键点通过 Keys extends keyof T 限定传入的键为 _ObjType _的键
// Pick<T, Keys>
type Person = {
age: number,
name: string,
young: boolean
}
type Num = Pick<Person, 'age'>
type PickGeneric<Obj, Keys extends keyof Obj> = {
[key in Keys]: Obj[key]
}
type AgeNameGeneric = PickGeneric<Person, 'age' | 'name'>
const p1: AgeNameGeneric = {
age: 22,
name: 'jack'
}
ExcludeGeneric<UnionType, ExcludedKeys> 怎么实现?
通过类型系统中泛型函数特殊的循环排除语法去做到
// 基本用法
type Num = Exclude<string | number, string>
type ExcludeGeneric<UnionType, ExcludedKeys> = UnionType extends ExcludedKeys ? never : UnionType
type Str = ExcludeGeneric<string | number, number>
从基本实现中仿佛可以不通过泛型函数去排除一个 _uniontype _中的其中一个,但实际是不行的
在泛型函数中的类型算法执行是不同的,像是一个类型算法的循环去检测符合的类型最后返回
type Union = 'age' | 'name' | 'young'
type ExcludeKey = 'age'
// 这样不通过泛型函数是实现不了排除功能的
type NumAge = Union extends ExcludeKey ? never : Union
Omit<Type, Keys> 泛型函数实现?
泛型函数中使用泛型函数
关键点
- Keys extends string | number | symbol 传入的值是可以用作对象的键
- Exclude<keyof ObjType, Keys> 利用 Exclude 工具泛型函数筛选处所需要的键
type Person = {
age: number,
name: string,
young: boolean
}
type AgeName = Omit<Person, 'young'>
type OmitGeneric<ObjType, Keys extends string | number | symbol> = {
[Key in Exclude<keyof ObjType, Keys>]: ObjType[Key]
}
type AgeName2 = OmitGeneric<Person, 'young'>
Extract<Type, Union>?
type Num = Extract<string | number, number>
type ExtractGeneric<UnionType, ExcludedKeys> = UnionType extends ExcludedKeys ? UnionType : never
type Str = ExtractGeneric<string | number, string>
NonNullable?
通过从 Type 中排除 null 和 undefined 来构造一个类型。
type T1 = NonNullable<string | number | undefined | null>
type NoNull1<UnionType> = Exclude<UnionType, null | undefined>
type NoNull2<UnionType> = UnionType extends null | undefined ? never : UnionType
type T2 = NoNull1<string | number | undefined | null>
type T3 = NoNull2<string | number | undefined | null>