我想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'
Run Code Online (Sandbox Code Playgroud)
我尝试了如下,但它不起作用......
type KeyOfType<M extends {
[key in keyof M]: any;
}, T> = M extends {
[key in infer R]: T;
} ? R : never;
Run Code Online (Sandbox Code Playgroud)
有什么办法可以解决这个问题吗?
我将在这里使用键重新映射,因为重新映射键never会将其从结果类型中删除:
type KeyOfType<M, T> = keyof {
[K in keyof M as M[K] extends T ? K : never]: K
};
Run Code Online (Sandbox Code Playgroud)
K这会迭代中的每个键M,并检查值是否M[K]扩展了T类型。如果是,则保留该密钥,否则将密钥名称重新映射到never,并将其删除。值类型并不重要,因为您只需要键,因此只需将其推入K其中似乎就可以了。然后keyof在开始时塞满 a 只拔出钥匙。
| 归档时间: |
|
| 查看次数: |
49 次 |
| 最近记录: |