Typescript 从名称中获取对象属性类型

Posted

技术标签:

【中文标题】Typescript 从名称中获取对象属性类型【英文标题】:Typescript get object property type from name 【发布时间】:2020-03-17 09:11:10 【问题描述】:

我正在尝试在响应式总线类中的 typescript 中执行类型推断功能。

这是一个例子:

  // This is the function
  getValue<T>(data: T, key: keyof T) 
    return data[key];
  

  // This is the test
  interface IState 
    field1: number;
    field2: string;
  

  const state: IState = 
    field1: 123,
    field2: 'abc'
  ;

  const x = getValue(state, 'field1');

成功推断出键变量(我不能键入与界面键不同的值)。 问题是这样做的'x'变量的类型是数字|字符串,但我期待数字。

我错过了什么吗?有可能吗?

谢谢!

【问题讨论】:

【参考方案1】:

您的getValue 实现推断返回类型为T[keyof T],即number|string

你想要的可以通过以下方式实现:

function getValue<T, K extends keyof T>(data: T, key: K) 
  return data[key];


// This is the test
interface IState 
  field1: number;
  field2: string;


const state: IState = 
  field1: 123,
  field2: 'abc'
;

const x = getValue(state, 'field1');

这样,getValue 的返回类型为T[K],其中K 被推断为keyof T 中的一个特定键。

【讨论】:

以上是关于Typescript 从名称中获取对象属性类型的主要内容,如果未能解决你的问题,请参考以下文章

在 TypeScript 和/或 JSDoc 中,如何指示记录类型中的某些属性名称是同一类型中兄弟属性的别名?

如何获取与 Typescript 中的接口匹配的对象的所有属性? [复制]

Typescript杂谈

从 lambda 表达式中获取属性名称*没有*对象实例

Typescript:至少有一个T类型属性的对象。

TypeScript:在 keyof T 处获取属性的类型