使用 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
例如,我们如何只提取字符串类型的键? 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