我有以下设置,当我循环使用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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Sar*_*ana 39
你可能也allProviders
输入了object[]
.并且财产country
不存在object
.如果你不关心打字,你可以同时声明allProviders
,并countryProviders
为Array<any>
:
let countryProviders: Array<any>;
let allProviders: Array<any>;
Run Code Online (Sandbox Code Playgroud)
如果你想要静态类型检查.您可以为结构创建一个接口并使用它:
interface Provider {
region: string,
country: string,
locale: string,
company: string
}
let countryProviders: Array<Provider>;
let allProviders: Array<Provider>;
Run Code Online (Sandbox Code Playgroud)
Bou*_*him 21
如果您的对象可以包含任何键/值对,您可以声明一个名为keyable
如下的接口:
interface keyable {
[key: string]: any
}
Run Code Online (Sandbox Code Playgroud)
然后按如下方式使用它:
let countryProviders: keyable[];
Run Code Online (Sandbox Code Playgroud)
或者
let countryProviders: Array<keyable>;
Run Code Online (Sandbox Code Playgroud)
对于您的特定情况,请尝试定义密钥类型并使用Record
实用程序来定义对象:
type ProviderKey="region" | "country" | "locale" | "company"
let countryProviders: Array<Record<ProviderKey,string>>;
Run Code Online (Sandbox Code Playgroud)
Har*_*nki 14
是的,强烈推荐上述方法,但如果您别无选择并想继续使用“allProviders”作为对象数组,那么请使用此方法。这对我有用,无需创建界面。
if(providers["country"] === "US") // replacement
Run Code Online (Sandbox Code Playgroud)
object
是的,如果可以的话,你应该尽量避免any
等等,毕竟这种东西被称为 TypeScript 是有原因的。
然而,如果你需要一个肮脏的伎俩:
let o: object = { id: 1 }
console.log(o.id); // throws error
console.log((o as any).id); // fine
Run Code Online (Sandbox Code Playgroud)
一如既往:任何事情都可以。
归档时间: |
|
查看次数: |
67626 次 |
最近记录: |