获取Typescript界面​​属性类型,仅指定属性名称

时间:2019-11-01 21:24:49

标签: typescript

我有一个带有许多属性的Typescript界面​​。没有此接口的任何实例,我需要确定给定属性的类型。

export interface Data {
  foo: string;
  bar: number;
  .
  .
  .
}

这可以通过在Data上使用带有不变字符串的索引签名来实现。

type propType = Data['foo']; // propType = 'string'

但是,使用变量不起作用。

const propName = 'foo';
type propType = Data[propName]; // Errors

错误:

  • 类型'any'不能用作索引类型。ts(2538)
  • “ propName”是指一个值,但此处被用作类型。ts(2749)

这两个错误都没有道理,因为propName绝对是string而不是any,也不是“这里用作类型”。

更新

很明显,我正在尝试做一些不可能的事情。经过艰苦的战斗,我终于接受了未经实例化的接口,并且在运行时不会拥有属性或属性类型信息。

使用type的此方法将有效,但仅在编译时有效。我批准了使用正确语法的答案。

(仍然认为我的问题中的错误消息很奇怪。)

1 个答案:

答案 0 :(得分:0)

您有两种解决方案。要么

export interface Data {
  foo: string;
  bar: number;
}

type propName = 'bar';
type propType = Data[propName]; //number

export interface Data {
  foo: string;
  bar: number;
}

const propName = 'bar'; //or let propName: 'bar' = 'bar' (both are type literals)
type propType = Data[typeof propName]; //number (typeof propName is 'bar')