【问题标题】:How to iterate over Typescript interface properties?如何迭代 Typescript 接口属性?
【发布时间】:2020-04-15 10:52:57
【问题描述】:

我有一个接口FilterData,如下所示:

export interface FilterData {
  variables?: string[];
  processDefinitionKey?: string;
}

在对服务器的请求中,我收到了 filterSettings 类型的对象 FilterData,我需要对其进行迭代。

这就是我现在正在做的事情:

for (const key in filterSettings) {
  filterString += `${key}_eq_${filterSettings[key]},`;
}

但我收到以下错误:

元素隐含地具有“任何”类型,因为类型的表达式 'string' 不能用于索引类型 'FilterData'。无索引 在类型上找到带有“字符串”类型参数的签名 'FilterData'.ts(7053)

我读到here 说该接口在运行时不存在,但我不知道可能有什么解决方法。我如何迭代接口对象?

【问题讨论】:

  • 你能分享你的整个代码吗?我认为您在此处发布的代码没有任何问题。 const key in filterSettings,在运行时不使用FilterData,而只是使用filterSettings 的对象属性。它应该可以工作(并且在我的小暂存文件中)。
  • 我试过.. 我没有收到错误。你试过更新打字稿吗?
  • @xdeepakv 如果您的 typescript 配置不允许隐式任何内容,您确实会收到该错误。

标签: javascript node.js typescript


【解决方案1】:

接口在运行时确实不存在,但您仍然可以从该接口迭代现有对象的属性。

请在此处查看我的回答 How to loop though Record<K, T> 了解迭代对象的方法

【讨论】:

    【解决方案2】:

    你可以对 typescript 说你确定 keykeyof Filterdata

    for (const key in filterSettings) {
      filterString += `${key}_eq_${filterSettings[key as keyof FilterData]},`;
    }
    

    您可以在tsconfig.json 中设置noImplicitAny: false

    【讨论】:

      【解决方案3】:

      确实,该接口在运行时不存在。您必须对所需的属性进行硬编码 - 实现接口的对象也可能具有任何其他属性:

      const filterSettings: FilterData;
      
      for (const key of ['variables', 'processDefinitionKey']) {
        filterString += `${key}_eq_${filterSettings[key]},`;
      }
      

      【讨论】:

        猜你喜欢
        • 2018-01-22
        • 2019-04-25
        • 2022-01-04
        • 1970-01-01
        • 2018-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-06
        相关资源
        最近更新 更多