javascript - Typescript: Vlastnosť neexistuje na type 'object'
Mám nasledujúce nastavenie a keď prechádzam pomocou for...of, dostanem chybu:
Vlastnosť "country" neexistuje v type "object".
Je toto správny spôsob, ako prejsť každý objekt v poli a porovnať hodnotu vlastnosti objektu?
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);
}
}
}
Odpoveď č. 1
Pravdepodobne máte allProviders taktiež typované ako object[]. A vlastnosť country neexistuje na object. Ak vám nezáleží na typovaní, môžete deklarovať oba allProviders a countryProviders ako Array<any>:
let countryProviders: Array<any>;
let allProviders: Array<any>;
Ak naozaj chcete statickú kontrolu typov, môžete vytvoriť rozhranie pre štruktúru a použiť ho:
interface Provider {
region: string,
country: string,
locale: string,
company: string
}
let countryProviders: Array<Provider>;
let allProviders: Array<Provider>;
Odpoveď č. 2
Ak váš objekt obsahuje nejaké páry kľúč/hodnota, môžete deklarovať rozhranie nazvané keyable takto :
interface keyable {
[key: string]: any
}
potom ho použite takto :
let countryProviders: keyable[];
alebo
let countryProviders: Array<keyable>;
Pre váš konkrétny prípad sa skúste pokúsiť definovať typ kľúča a použiť Record nástroj na definovanie objektu:
type ProviderKey="region" | "country" | "locale" | "company"
let countryProviders: Array<Record<ProviderKey,string>>;
Odpoveď č. 3
Áno, vyššie uvedené metódy sú veľmi odporúčané, ale ak nemáte na výber a chcete naďalej používať „allProviders“ ako pole objektov, potom použite túto metódu. Mne to fungovalo bez vytvorenia rozhrania.
if(providers["country"] === "US") // replacement
