type NonNullable<T> = T extends null | undefined ? never : T
用法示例:
type T0 = NonNullable<string | number | undefined>;
// 结果
type T0 = string | number
十、infer 关键词
typescript2.8 新出的语法
在条件语句中作为待推断的类型变量,推断返回值类型
可以将元组变成联合类型
理解好这个用法, Parameters, ReturnType 等内置类型的实现 都用到这个
用法示例:
示例1:
type Foo<T> = T extends { a: infer U; b: infer U } ? U : never;
type T1 = Foo<{ a: string; b: string }>; // T1类型为 string
type T2= Foo<{ a: string; b: number }>; // T1类型为 string | number
示例2:元组变联合类型
type I3 = [string,number]
type Tg<T> = T extends (infer R)[] ? R : never
type T4 = Tg<I3>;// T4类型为: string|number
十一、Parameters<T>:获取函数参数类型
源码实现:
type Parameters<T extends (...args:any) => any> = T extends (...args: infer P) => any ? P:never
typescript除了一些常用的
typeof
获取一个变量或对象的类型、keyof
遍历类型的属性等外,还提供了很多实用内置的类型,大家安装typescript 的时候,可以在node-module/typescript/lib/文件下面有对js 所有的声明文件,包含es5,es6...到最新的esnext 版本,本篇主要是总结一下对typescript 实用内置类型的笔记,比如 官方文档给出的这些:Exclude<T, U>
:从T中剔除可以赋值给U的类型。Extract<T, U>
:提取T中可以赋值给U的类型。NonNullable<T>
:从T中剔除null和undefined。ReturnType<T>
:获取函数返回值类型。InstanceType<T>
:获取构造函数类型的实例类型。TypeScript官方在线运行:https://www.typescriptlang.org/zh/play
一、
Required<T>
:将所有属性类型转为必选属性类型源码实现:把问号减去
用法示例:本来User 的属性类型都是可选的,现在变成必选了
二、
Partial<T>
:将所有类型转为可选类型源码实现:把问号加上
用法示例
三、
Readony<T>
: 将所有属性类型转为只读属性选项类型源码实现: 在属性key 前面加readonly 关键词
用法示例:
四、
Pick<T, K>
:从 T 中筛选出 K (大类型中挑选小类型)源码实现:
用法示例:
五、
Record<T, K>
: 将K中所有属性值转化为T类型源码实现:
用法示例:
六、
Exclude<T, U>
: 用于从类型T中去除不在U类型中的成员,(T中有,U中没有)源码实现:用条件类型实现
用法示例:
七、
Extract<T, U>
:Exclude 的反操作,(取 T U 两者的交集属性)源码实现: 条件类型实现
用法示例:
八、
Omit<T, K>
:从类型 T 中 除去指定属性类型 K源码实现: 利用
pick
+Exclude
结合实现K extends keyof T
说明这个类型值必须为T类型属性的子集。假如有一个interface定义如下:
在传入这个Student到Pick中时
在上面的Omit实现中,我们用到了Exclude这个条件类型,根据上文中的说明,Exclude的效果就是寻找在keyof T中有,但在K类型中没有的成员,这样就将剩余的类型过滤了出来,再去应用Pick,就获得了我们的Omit实现。
用法示例:
九、
NonNullable<T>
:从 T 中剔除 null,underfined 类型源码实现:
用法示例:
十、
infer
关键词用法示例:
十一、
Parameters<T>
:获取函数参数类型源码实现:
用法示例:
十二、
ReturnType
:获取函数返回值类型源码实现
用法示例:
十三、
ConstructorParamters
:获取构造函数的参数类型源码实现:
用法示例:
十四、
InstanceType
:获取构造函数类型的实例类型(获取一个类的返回类型)源码实现: