在TS中as常用于实现类型断言,如下面的例子。

let someValue: unknown = "Hello World";

let strLength: number = (someValue as string).length; // 断言为字符串
console.log(strLength); // 11

本文所讲的as是用于 映射类型(Mapped Types)时的重映射键(Key Remapping)。这是 TypeScript 4.1 版本引入的一项功能,它允许我们在映射类型中更改或重新映射键名。

先看下面这段代码

type MyOmit<T, K extends keyof T> = {
  [P in keyof T as P extends K ? never : P]: T[P];
}

MyOmit实现了Typescript中的原生Omit 类型,它的作用是从类型 T 中移除 K 中的键。

在这个实现中必须使用as关键字重新映射键

// 不写as无法正常运行。
// type MyOmit<T, K extends keyof T> = {
//   [P in keyof T extends K ? never : P]: T[P];
// }

如果没有 as 关键字,键P将被解释为普通属性键,那么基于 P extends K 的判定将无法按预期工作。

再看下面这个题

  type OmitBoolean = OmitByType<{
    name: string
    count: number
    isReadonly: boolean
    isEnable: boolean
  }, boolean> // { name: string; count: number }

题目要求实现一个OmitByType类型,实现对原有类型按value类型剔除。

type OmitByType<T extends Record<string, any>, U> = {
  [K in keyof T as T[K] extends U ? never : K]: T[K]
}

这里 K in keyof T as T[K] 是精髓所在,用 as 赋值,赋一个新值 T[K] 而 不是 T。

同步更新到自己的语雀
https://www.yuque.com/dirackeeko/blog/fpbeenmel5xzxkcu


DiracKeeko
125 声望2 粉丝