【问题标题】:Get Typescript interface property type, given property name only获取 Typescript 接口属性类型,仅给定属性名称
【发布时间】: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


【解决方案1】:

您有两种解决方案。要么

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')

【讨论】:

  • 所以我的印象是,当以这种方式访问​​Data 时,只有type 可以放在括号中。奇怪的是它可以与 'string' 一起使用。
  • @Katie 你确定你在使用const propName = 'bar';吗?那是type literal,所以基本上Typescript在这里推断出最窄的类型,即bar,而不是string。
  • @Katie 看,它工作得很好。你的代码一定有问题。此外,无论何时处理类型,都不要使用值。因此,当propName 是一个值时,typeof propName 是一个值。
  • 现在我不清楚我可以用那个类型对象做什么。例如,我如何打印出“bar”应该是“number”类型?
猜你喜欢
  • 2014-06-27
  • 1970-01-01
  • 2021-12-04
  • 2019-02-13
  • 2020-03-17
  • 2021-06-28
  • 2021-11-30
  • 2012-01-09
  • 2019-09-22
相关资源
最近更新 更多