我想为设置特定类型值的键创建一个类型KeyOfType<M, T>
。
interface MyTypeMap {
"one": 1;
"two": "hello";
"three": 3;
"four": "world";
"five": 5;
};
type KeyOfType<M, T> = ....; // ?????
type Foo = KeyOfType<MyTypeMap, string>; // 'two' | 'four'
type Bar = KeyOfType<MyTypeMap, number>; // 'one' | 'three' | 'five'
我试过下面的方法,但不起作用。。。
type KeyOfType<M extends {
[key in keyof M]: any;
}, T> = M extends {
[key in infer R]: T;
} ? R : never;
有什么办法解决这个问题吗?
我会在这里使用密钥重映射,因为将密钥重映射到never
会将其从生成的类型中删除:
type KeyOfType<M, T> = keyof {
[K in keyof M as M[K] extends T ? K : never]: K
};
这对M
中的每个键K
进行迭代,并且对值M[K]
的检查扩展了T
类型。如果是,请保留密钥,否则将密钥名称重新映射为never
,然后将其删除。值类型无关紧要,因为您只需要密钥,所以将K
推入其中似乎很好。然后在开始时塞一个keyof
,只拔出钥匙。
游乐场