带有有关索引类型的断言的 Typescript 泛型函数



我有兴趣拥有一个可以在任何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'等。

打字稿可以做到这一点吗?

谢谢!

可以创建一个类型,该类型仅从源对象中提取与该对象中的字符串值对应的键

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] 将返回该对象属性的所有潜在值。从不特别,因此被排除在此列表中。

最新更新