把之前对 TS 类型系统理解的不到位的地方记录一下,安利一个库 Type Challenges,可以测测自己对 TS 类型的理解水平。
extends
在TS
类型中类似于<=
的功能,表示前面的类型是否能够分配给后一种类型;(在类型表示继承,在泛型中表示约束)infer
表示推断类型,必须要配合extends
使用;- 泛型中使用
=
表示默认类型; - 可以使用三目运算符,配合
extends(<=)
可以实现类型的判断; - 想把某个
key
删掉,可以使用never
,相当于运算时的null
; - 可以使用下标把数组中的所有元素取出来当类型
T[number]
,还可以使用T['length']
来计算数组长度。 - 可以使用
[...T, U]
这种把追加类型 - 使用
as
可以将key
转换成另一种类型
具体例子
- 获取阿波罗信息
interface AplloConfig {
value1: string
value2: number
}
// 这样会取出 AplloConfig 的联合类型,即 string | number,具体使用到的时候,还需要进行强转
getApllo(key: keyof AplloConfig) {}
// 这样写的话可以直接取到 value1 或者 value2 的类型
getApllo<T extends keyof AplloConfig>(key: T) {}
- 定义网络请求的返回值
interface Result<T> {
code?: number
result?: T
// 兼容其他接口返回的数据结构不一致
[key: string]: any
}
- Omit
type MyOmit<T, K extends keyof T> = { [P in keyof T as P extends K ? never : P]: T[P] }