类型'对象'上不存在属性

Jas*_*ang 27 typescript

我有以下设置,当我循环使用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,并countryProvidersArray<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)

  • @RafaelReyes如果您只需要对对象进行编译时类型检查,则可以使用接口(接口在构建期间被擦除,不会影响生成的JS).但是,类会转换为JS.根据这个问题,不需要创建一个类. (3认同)

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)

  • 如何访问该字段与问题无关:TypeScript Playground – https://www.typescriptlang.org/play?ts=4.3.5#code/MYewdgzgLgBAhgLhiARgKwKbFgXhgbwF8AoUSWABwAYY84A6CEAWwwAUAnEC2nPAAwwcuHXjE7chUAJ4wA5E1YSKcmABMQGCDDAhYGAB4BLa MJAwZFDPNSZsc-gG5S4UxQCMteAG0FLdlwqALq8AkIiYspSsn5KgaoaWjp6MIYmsOAW0lY26FhQDs5AA (2认同)

Mar*_*cel 5

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)

一如既往:任何事情都可以。