TypeScript
TS 中的一些符号
! 断言操作符
断言某个变量不会是 null/undefined,告诉编辑器停止报错。
?. 链判断运算符
?.运算符,可选链
直接在链式调用的时候判断,左侧的对象是否为 null 或 undefined。如果是的,就不再往下运算,而是返回 undefined。
TS 中的一些关键词
type
自定义类型
interface
interface 也是用来定义类型的
typeof
typeof 可以获取一个变量的声明类型
在 JavaScript 中, typeof 可以判断一个变量的基础数据类型, 在 TS 中,它还可以获取一个变量的声明类型
const obj = { a: ‘1’ };type Foo = typeof obj; // type Foo = { a: string }
keyof
1 | keyof 可以获取一个对象接口的所有 key 值 |
in
in 可以遍历枚举类型
1 | type Keys = 'a' | 'b' | 'c'; |
TS 一些工具泛型的使用及其实现
Partial
Partial 作用是将传入的属性变为可选项.
首先我们需要理解两个关键字 keyof 和 in, keyof 可以用来取得一个对象接口的所有 key 值.
比如
1 | interface Foo { |
而 in 则可以遍历枚举类型, 例如
1 | type Keys = 'a' | 'b'; |
keyof 产生联合类型, in 则可以遍历枚举类型, 所以他们经常一起使用, 看下 Partial 源码
1 | type Partial<T> = { [P in keyof T]?: T[P] }; |
上面语句的意思是 keyof T 拿到 T 所有属性名, 然后 in 进行遍历, 将值赋给 P, 最后 T[P] 取得相应属性的值.
结合中间的 ? 我们就明白了 Partial 的含义了.
Required 将类型的属性变成必选
1 | type Required<T> = { [P in keyof T]-?: T[P] }; |
我们发现一个有意思的用法 -?, 这里很好理解就是将可选项代表的 ? 去掉, 从而让这个类型变成必选项. 与之对应的还有个+? , 这个含义自然与-?之前相反, 它是用来把属性变成可选项的.
Pick
Pick 从某个类型中挑出一些属性出来
1 | type Pick<T, K extends keyof T> = { [P in K]: T[P] }; |
Record
1 | type Record<K extends keyof any, T> = { [P in K]: T }; |
Mutable
类似地, 其实还有对 + 和 -, 这里要说的不是变量的之间的进行加减而是对 readonly 进行加减.
以下代码的作用就是将 T 的所有属性的 readonly 移除,你也可以写一个相反的出来.
1 | type Mutable<T> = { |
Readonly
Readonly 类型的属性变成只读
1 | type Readonly<T> = { readonly [P in keyof T]: T[P] }; |
ReturnType
在阅读源码之前我们需要了解一下 infer 这个关键字, 在条件类型语句中, 我们可以用 infer 声明一个类型变量并且对它进行使用,
我们可以用它获取函数的返回类型, 源码如下
1 | type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any; |
其实这里的 infer R 就是声明一个变量来承载传入函数签名的返回值类型, 简单说就是用它取到函数返回值的类型方便之后使用.
具体用法
1 | function foo(x: number): Array<number> { |