typescript :属性在类型“object”上不存在

6ovsh4lw  于 2023-06-24  发布在  TypeScript
关注(0)|答案(4)|浏览(662)

我有以下设置,当我循环使用for...of时,得到一个错误:
属性“country”不存在于类型“object”上。
这是遍历数组中的每个对象并比较对象属性值的正确方法吗?

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);
      }
   }
}
gjmwrych

gjmwrych1#

您可能也将allProviders键入为object[]。属性countryobject上不存在。如果你不关心输入,你可以声明allProviderscountryProvidersArray<any>

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>;
vdgimpew

vdgimpew2#

如果你的对象包含任何键/值对,你可以声明一个名为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>>;
btxsgosb

btxsgosb3#

是的,强烈推荐上述方法,但如果你别无选择,想继续使用“allProviders”作为对象数组,那么就使用这个方法。这对我来说很有效,不需要创建接口。

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

r9f1avp54#

是的,你应该尽量避免objectany等。如果可以的话,毕竟这东西被称为TypeScript是有原因的。
但是,如果你需要一个肮脏的伎俩:

let o: object = { id: 1 }
console.log(o.id);                // throws error
console.log((o as any).id);       // fine

一如既往:任何事都随任何事一起去。

相关问题