[英]Typescript generic function with assertion about indexed type
我有兴趣拥有一个可以在任何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
string | number
? 而且我还希望propertyName
只有一个有效值'x'
(显然在实际情况下会有多个字符串字段,在这种情况下它将是'stringField1' | 'stringField2'
等。
这可以用 TypeScript 实现吗?
谢谢!
您可以创建一种类型,该类型仅从源对象中提取与该对象中的字符串值对应的键
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
}
您不必为 typescript 可以推断出的属性类型显式具有类型参数。
StringKeys 类型通过为字符串值属性创建映射类型[key]:[key]
('x':'x') 和为非字符串属性创建[key]:never
('y':never) 映射类型来工作。 最后的 [keyof T] 将返回该对象属性的所有潜在值。 Never 是特殊的,因此从这个列表中排除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.