【发布时间】:2020-02-28 03:44:37
【问题描述】:
我有一个带有许多属性的 Typescript 界面。如果没有此接口的任何实例,我需要确定给定属性的类型。
export interface Data {
foo: string;
bar: number;
.
.
.
}
这可以在Data 上使用带有非变量字符串的索引签名来实现。
type propType = Data['foo']; // propType = 'string'
但是,它不能使用变量。
const propName = 'foo';
type propType = Data[propName]; // Errors
错误:
- 类型 'any' 不能用作索引 type.ts(2538)
- 'propName' 指的是一个值,但在这里被用作一个类型。ts(2749)
这些错误都没有意义,因为propName 绝对是string 而不是any,而且它不是“在这里被用作类型”。
更新
很明显,我试图做一些不可能的事情。经过一番斗争,我终于接受了未实例化的接口在运行时不会也永远不会有属性或属性类型信息。
这个使用type 的方法可以工作,但只能在编译时使用。我用正确的语法批准了答案。
(仍然认为我的问题中的错误消息很奇怪。)
【问题讨论】:
-
你试过
Data[typeof propName]吗? -
我认为 keyof Data 作为 propName 的类型可能会有所帮助 - 稍后会检查它......编辑:嗯,不高兴......
-
@Katie 如果你能详细说明你在现实世界的场景中想要做的更多可能会有所帮助 - 深入研究这个,我不完全理解你想要做什么.我假设您的变量 propName 将在运行时填充,而不是像您的示例中那样硬编码。这是您的问题的一部分,您正在编写的 TypeScript
type propType = Data['foo']用于编译时的东西 - 在运行时我很确定您唯一的选择是在初始化对象上使用 typeof。 -
@MrRobboto 感谢您将我推荐给
keyof,但不幸的是,这会产生完全相同的错误。 -
@MrRobboto 我会尝试更好地解释这种情况。这绝对是一个奇怪的边缘案例,我将不得不花一些时间想出一个通用的例子。
标签: typescript