指示在 Typescript 中设置特定类型值的键的类型

gra*_*ace 10 typescript

我想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)

有什么办法可以解决这个问题吗?

Ale*_*yne 3

我将在这里使用键重新映射,因为重新映射键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 只拔出钥匙。

操场