我对拥有可以在任何keyof T
上通用地运行的函数感兴趣,但是断言T[K]
是特定类型(即string
)。我认为可以通过以下代码示例来最好地说明这一点:
interface FooBar {
x: string;
y: number;
}
function foo<K extends keyof FooBar, ???>(propertyName: K, fooBar: FooBar) {
const value = fooBar[propertyName];
// I want the type of value to be `string`
}
我可以投入什么?是否将fooBar[propertyName]
键入为string
而不是string | number
?而且我还希望propertyName
仅具有有效值'x'
(显然,在实际情况下,会有多个字符串字段,在这种情况下,它将是'stringField1' | 'stringField2'
等)。
使用TypeScript可以吗?
谢谢!
答案 0 :(得分:1)
您可以创建一种类型,该类型仅从源对象中提取与该对象中的字符串值相对应的键
interface FooBar {
x: string;
y: number;
}
type StringKeys<T> = {
[P in keyof T]: T[P] extends string? P: never;
}[keyof T]
function foo<K extends StringKeys<FooBar>>(propertyName: K, fooBar: FooBar):string {
const value = fooBar[propertyName];
return value
}
您不必显式地使用类型参数,因为属性类型脚本可以推断出它。
StringKeys类型通过为字符串值属性创建[key]:[key]
('x':'x')和为非字符串属性[key]:never
('y':never)创建映射类型。最后的[keyof T]将返回该对象属性的所有潜在值。从不特殊,因此从此列表中排除。