在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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。