使用 keyof 提取仅包含具有特定类型值的键的字符串文字并集

Use keyof to extract a string literal union of only keys that have values of a specific type

例如,我们如何只提取字符串类型的键? Here is what I have tried:

type StringEntriesOnly<T> = {
    [K in keyof T]: T[K] extends string ? T[K] : never;
}

type SomeType = {
    aString: string;
    aNumber: number;
}

const v1: StringEntriesOnly<SomeType> = {
    aString: 'Hello',
    aNumber: 10, // This is a compiler error. Good. 
}

type StringKeys = keyof StringEntriesOnly<SomeType>;

const v2: StringKeys = 'aNumber'; // How can we make the compiler complain here?

在上面的例子中,我希望 StringKeys 只允许 'aString'。

我通常这样定义KeysMatching

type KeysMatching<T, V> = { [K in keyof T]-?: T[K] extends V ? K : never }[keyof T];

-? 在引入其他陷阱的同时避免了一些可选属性的陷阱;检查边缘情况)

这给了你

type StringKeys = KeysMatching<SomeType, string>;
// type StringKeys = "aString"

const v2: StringKeys = 'aNumber'; // error!

希望对您有所帮助。 Playground link