实现一个 RemoveIndexSignature 工具类型,用于移除已有类型中的索引签名。具体的使用示例如下所示:
interface Foo {
[key: string]: any;
[key: number]: any;
bar(): void;
}
type RemoveIndexSignature<T> = {
[k in keyof T as string extends k
? never
: number extends k
? never
: k]: T[k];
}; // 你的实现代码
type FooWithOnlyBar = RemoveIndexSignature<Foo>; //{ bar: () => void; }
为什么是 number extends k 呢?因为按照我的理解,本意是判断k是否等于number,那么k extends number 应该也是一样的效果,但是确实只有number extends k实现了想要的效果。
而且这个as的用法也让我疑惑
试了下
k extends number
也可以呀这样应该就比较容易懂了: