logoProsperBao

Remove Index Signature

2022-04-09 04

题目来源(type-challenges)

问题

实现一个 RemoveIndexSignature<T>,去除对象中的索引签名

type Foo = {
  [key: string]: any;
  foo(): void;
}

type A = RemoveIndexSignature<Foo>  // expected { foo(): void }

解答

type RemoveIndexSignature<T> = {
  [K in keyof T as string extends K 
    ? never
    : K extends number
      ? never
      : K
  ]:T[K]
}

拆分

  1. 需要把索引签名看成几个部分
  2. K in keyof T as string
  3. ⬆️ extends K
  4. 后面的判断分支
  5. 索引类型 K 可以是字符串,也可以是数字,暂不考虑其他类型