获取Typescript接口属性类型,仅给定属性名称

获取Typescript接口属性类型,仅给定属性名称,typescript,Typescript,我有一个带有许多属性的Typescript接口。如果没有此接口的任何实例,我需要确定给定属性的类型 导出接口数据{ foo:string; 条:数字; . . . } 这可以使用带有非变量字符串的数据上的索引签名 type-propType=Data['foo'];//propType='string' 但是,它不使用变量 constpropname='foo'; 类型propType=数据[propName];//错误 错误: 类型“any”不能用作索引类型。ts(2538) “pro

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

导出接口数据{
foo:string;
条:数字;
.
.
.
}
这可以使用带有非变量字符串的
数据
上的索引签名

type-propType=Data['foo'];//propType='string'
但是,它不使用变量

constpropname='foo';
类型propType=数据[propName];//错误
错误:

  • 类型“any”不能用作索引类型。ts(2538)
  • “propName”引用了一个值,但在此处用作类型。ts(2749)
这两个错误都没有意义,因为
propName
肯定是一个
字符串,而不是
any
,并且它不是“在这里用作类型”

更新

很明显,我在试图做一些不可能的事情。经过多次争论,我终于接受了未实例化的接口在运行时不会也永远不会有属性或属性类型信息

此方法使用
类型
将起作用,但仅在编译时起作用。我用正确的语法批准了答案


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

您有两种解决方案。或者

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

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


您是否尝试过
数据[typeof propName]
?我认为作为propName类型的keyof Data可能会有所帮助-将在几天后检查出来。。。编辑:嗯,这没什么乐趣…@Katie,如果你能详细说明一下在现实世界中你想做些什么,这可能会有所帮助-深入研究一下,我不完全理解你想做什么。我假设变量propName将在运行时填充,而不是像示例中那样硬编码。这是您的问题的一部分,您正在编写的类型脚本
typeproptype=Data['foo']
用于编译时的内容-在运行时,我很确定您唯一的选择是在初始化对象上使用typeof。@MrRobboto感谢您让我参考
keyof
,但不幸的是,这会产生完全相同的错误。@MrRobboto我会尝试更好地解释这种情况。这绝对是一个奇怪的边缘案例,我将不得不花一些时间想出一个通用的例子。因此,我得到的印象是,当以这种方式访问
数据时,只有
类型
可以放在括号中。奇怪的是,它使用的是
'string'
。@Katie你确定你使用的是
const-propName='bar'?这是type literal,因此基本上Typescript推断出这里最窄的类型,即
bar
,而不是
string
@Katie@Katie请看,它工作得很好。你的代码一定有问题。此外,无论何时处理类型,都不要使用值。因此,当
propName
是一个值时,propName的
typeof
是一个值。我现在不清楚该类型对象可以做什么。对于exmaple,我如何打印出“bar”应为“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')