繁体   English   中英

带有关于索引类型的断言的打字稿泛型函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM