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

时间:2019-08-29 15:59:43

标签: 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'等)。

使用TypeScript可以吗?

谢谢!

1 个答案:

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

相关问题