类型: “对象”类型上不存在属性

我有下面的设置,当我使用 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);
}
}
}
373392 次浏览

你可能也把 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>;

如果您的对象包含任何键/值对,您可以像下面这样声明一个名为 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>>;


是的,强烈建议使用上述方法,但是如果您别无选择,并且希望继续使用“ allProvider”作为对象数组,那么可以使用这个方法。这在不创建接口的情况下对我很有效。

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