generated at
RemoveIndexSignature<R>
recordを引数に取って、そこに含まれるindex signatureを省く


使用例
ts
type 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]; };


考え方
recordを引数にとって、条件付きでfieldを省くので、TypeScriptのRecordからRecordへの型レベルfilterをすれば良いことがわかる
次に、どういう条件か?を考える
fieldは4種類ほどある
ts
type 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が無いから。
ts
type RemoveIndexSignature<T extends Record<string, unknown>> = { [K in keyof T as (K extends `${infer _}` ? K : never)]: T[K] }
これは { 1: string } のようなものも省いてしまうので適切ではないmrsekut


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