Type Challenges

38 阅读1分钟

把之前对 TS 类型系统理解的不到位的地方记录一下,安利一个库 Type Challenges,可以测测自己对 TS 类型的理解水平。

  1. extendsTS 类型中类似于 <= 的功能,表示前面的类型是否能够分配给后一种类型;(在类型表示继承,在泛型中表示约束)
  2. infer 表示推断类型,必须要配合 extends 使用;
  3. 泛型中使用 = 表示默认类型;
  4. 可以使用三目运算符,配合 extends(<=) 可以实现类型的判断;
  5. 想把某个 key 删掉,可以使用 never,相当于运算时的 null
  6. 可以使用下标把数组中的所有元素取出来当类型 T[number],还可以使用 T['length'] 来计算数组长度。
  7. 可以使用 [...T, U] 这种把追加类型
  8. 使用 as 可以将 key 转换成另一种类型

具体例子

  1. 获取阿波罗信息
interface AplloConfig {
    value1: string
    value2: number
}
// 这样会取出 AplloConfig 的联合类型,即 string | number,具体使用到的时候,还需要进行强转
getApllo(key: keyof AplloConfig) {}

// 这样写的话可以直接取到 value1 或者 value2 的类型
getApllo<T extends keyof AplloConfig>(key: T) {}
  1. 定义网络请求的返回值
interface Result<T> {
    code?: number
    result?: T
    // 兼容其他接口返回的数据结构不一致
    [key: string]: any
}
  1. Omit
type MyOmit<T, K extends keyof T> = { [P in keyof T as P extends K ? never : P]: T[P] }

引用

github.com/type-challe…