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

Súvisiace články