问题 #
实现一个 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]
}
拆分 #
- 需要把索引签名看成几个部分
K in keyof T as string
⬆️ extends K
- 后面的判断分支
- 索引类型
K
可以是字符串,也可以是数字,暂不考虑其他类型