打字稿 | 从对象 T 中提取具有 K 类型值的所有键名

Sos*_*h89 6 javascript generics typescript typescript-generics

我有一些接口/对象

interface Example1 {
    1: object,
    2: string,
    s: string,
    ss: string,
    as: string[],
    b: boolean,
    n: number
}
Run Code Online (Sandbox Code Playgroud)

有没有办法只获取具有 T 类型值的 string 类型的键?

预期结果:

type ExtractKeysOfValueType<T extends object,K> = ... // do the magic,
ExtractKeysOfValueType<Example1,string> // 's' | 'ss'
Run Code Online (Sandbox Code Playgroud)

我已经使用“Extract”来获取字符串类型的键,不包括符号和数字,但我不知道如何继续满足我的需求

Jon*_*lms 8

 type ExtractKeysOfValueType<T, K> = { [I in keyof T]: T[I] extends K ? I : never }[keyof T];
Run Code Online (Sandbox Code Playgroud)

受到这个问题的启发,尝试一下。这基本上首先将对象映射到键-键对象,并且相关值不是所需类型的键被映射到从不:

 { 1: object, s: string } -> { 1: never, s: "s" }
Run Code Online (Sandbox Code Playgroud)

然后获取所有值的类型,得到never | "s",并never从联合中省略,得到所需的类型。