RemoveIndexSignature<R>
使用例
tstype C = RemoveIndexSignature<Foo>; // { foo(): void, baz: string, 1: string }
type Foo = {
[key: string]: any;
foo(): void;
baz: string;
1: string;
};
定義
ts// prettier-ignore
type RemoveIndexSignature<T> = {
[K in keyof T as
string extends K ? never
: number extends K ? never
: K]: T[K];
};
考え方
次に、どういう条件か?を考える
fieldは4種類ほどある
tstype Foo = {
[key: string]: any;
foo(): void;
baz: string;
1: string;
};
ここから、indexed signatureであることを判定して省く必要がある
定義の意味
ポイントは []
の中の意味
K in keyof T as string extends K ? never : number extends K ? never : K
括弧を付けるならどうなるか?
(K in keyof T) as (.. ? .. : ..)
という構造
keyof T
で展開した後の K
に対して as (.. ? .. : ..)
がかかっている
定義を見てしまえば単純で、
取りうるfieldから、 string
か number
であるものを残しているだけ
別解っぽいが別解ではないもの
これはtype-challenges 1367では解答になりうる
解答欄に 1: string
のようなnumberなfieldが無いから。
tstype RemoveIndexSignature<T extends Record<string, unknown>> = {
[K in keyof T as (K extends `${infer _}` ? K : never)]: T[K]
}
これは
{ 1: string }
のようなものも省いてしまうので適切ではない

なんでこれ無理なん?
tstype RemoveIndexSignature<T> = {
[K in keyof T as K extends string | number ? never : K]: T[K];
};