Typescript: eigendom bestaat niet op Type ‘Object’

Ik heb de volgopstelling en wanneer ik door het gebruik van for...ofen een foutmelding krijgen van:

Property “Land” bestaat niet op Type “Object”.

is dit een juiste manier om door elk object in de array te lopen en de eigenschap van het object Property te vergelijken?

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

Antwoord 1, Autoriteit 100%

U hebt waarschijnlijk allProvidersgetypt als object[]ook. En eigendom countrybestaat niet op object. Als u niet om het typen wilt, kunt u zowel allProvidersen countryProvidersals Array<any>:

let countryProviders: Array<any>;
let allProviders: Array<any>;

Als u een statische typecontrole wilt. U kunt een interface voor de structuur maken en deze gebruiken:

interface Provider {
    region: string,
    country: string,
    locale: string,
    company: string
}
let countryProviders: Array<Provider>;
let allProviders: Array<Provider>;

Antwoord 2, autoriteit 17%

Als je object sleutel/waarde-paren zou kunnen bevatten, zou je een interface kunnen declareren met de naam keyablezoals :

interface keyable {
    [key: string]: any  
}

gebruik het dan als volgt:

let countryProviders: keyable[];

of

let countryProviders: Array<keyable>;

Probeer voor uw specifieke geval het sleuteltype te definiëren en gebruik het hulpprogramma Recordom het object te definiëren:

type ProviderKey="region" | "country" | "locale" | "company"
let countryProviders: Array<Record<ProviderKey,string>>;

Antwoord 3

Ja, de bovenstaande methoden worden sterk aanbevolen, maar als je geen keus hebt en “allProviders” wilt blijven gebruiken als een array van objecten, ga dan voor deze methode. Dit werkte voor mij zonder een interface te maken.

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

Other episodes