关键词: TypeScript, TypeChallenge
实现RemoveIndexSignature<T>
类, 将给定对象类型的索引 , 去除对象的 index signature 属性
举个栗子:
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 : number extends K ? never : K]: T[K]
};
去除 index signature, 即去除原对象中string
或number
类型的 key, 利用 TS 中的as
关键字我们很容易做到:
type RemoveIndexSignature<T> = {
[K in keyof T as (string extends K ? never : number extends K ? never : K)]: T[K]
// ---------------^^^^^^^^^^^^^^^^ 如果 K 是 string 或 number 返回 never, 否则照常返回
// 此操作相当于 filter 了 K, 返回 never 的丢弃, 同时 map 了 K, 只是 map 的结果是原样返回
};