TS extends关键字

实现一个 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的用法也让我疑惑

阅读 2.3k
1 个回答

试了下 k extends number 也可以呀

这样应该就比较容易懂了:

type RemoveIndexSignature<T> = {
  [k in keyof T as (string extends k
    ? never
    : k extends number
    // : number extends k
    ? never
    : k)]: T[k];
};
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题