【问题标题】:Typescript : Property does not exist on type 'object'打字稿:“对象”类型上不存在属性
【发布时间】:2017-09-06 10:01:39
【问题描述】:

我有以下设置,当我循环使用for...of 并得到错误:

类型“object”上不存在属性“country”。

这是循环遍历数组中每个对象并比较对象属性值的正确方法吗?

let countryProviders: object[];

export function GetAllProviders() {
   allProviders = [
      { region: "r 1", country: "US", locale: "en-us", company: "co 1" },
      { region: "r 2", country: "China", locale: "zh-cn", company: "co 2" },
      { region: "r 4", country: "Korea", locale: "ko-kr", company: "co 4" },
      { region: "r 5", country: "Japan", locale: "ja-jp", company: "co 5" }
   ]

   for (let providers of allProviders) {
      if (providers.country === "US") { // error here
         countryProviders.push(providers);
      }
   }
}

【问题讨论】:

    标签: javascript typescript


    【解决方案1】:

    是的,强烈推荐上述方法,但如果您别无选择,并且想继续使用“allProviders”作为对象数组,那么请使用此方法。这对我有用,无需创建界面。

    if(providers["country"] === "US") // replacement
    

    【讨论】:

    【解决方案2】:

    如果您的对象可以包含任何键/值对,您可以声明一个名为 keyable 的接口,例如:

    interface keyable {
        [key: string]: any  
    }
    

    然后按如下方式使用:

    let countryProviders: keyable[];
    

    或

    let countryProviders: Array<keyable>;
    

    针对您的具体情况,尝试定义键类型并使用Record 实用程序来定义对象:

    type ProviderKey="region" | "country" | "locale" | "company"
    
    let countryProviders: Array<Record<ProviderKey,string>>;
    
    

    【讨论】:

      【解决方案3】:

      您可能也将allProviders 输入为object[]。 object 上不存在属性 country。如果你不关心打字,你可以将allProviders和countryProviders都声明为Array&lt;any&gt;:

      let countryProviders: Array<any>;
      let allProviders: Array<any>;
      

      如果你确实想要静态类型检查。您可以为该结构创建一个接口并使用它:

      interface Provider {
          region: string,
          country: string,
          locale: string,
          company: string
      }
      
      let countryProviders: Array<Provider>;
      let allProviders: Array<Provider>;
      

      【讨论】:

      • 爱它!我正在寻找静态类型检查解决方案。谢谢@Saravana :)
      • 为什么不用类代替接口?
      • @RafaelReyes 如果您只需要在编译时对对象进行类型检查,您可以使用接口(接口在构建过程中被删除并且不会影响生成的 JS)。然而,类确实会转换为 JS。根据这个问题,不需要创建一个类。
      • @Saravana 如果您使用第三方软件包,您将如何处理此问题。我正在使用 JSforce 并尝试在对象上使用“搜索”功能,但它抛出“属性‘搜索’在类型‘连接’上不存在”……任何线索?
      • @user269867 那么这可能是类型定义未随库更新的情况。您可以自己添加方法并提出 PR in the DefinitelyTyped repo 进行永久修复(这需要一些时间)。或者如果你想暂时解决这个问题,你可以在声明中添加属性as described here
      猜你喜欢
      • 2017-03-02
      • 2021-09-07
      • 1970-01-01
      • 2017-08-07
      • 2017-03-26
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多