Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Typescript:类型';上不存在属性;对象';_Javascript_Typescript - Fatal编程技术网

Javascript Typescript:类型';上不存在属性;对象';

Javascript Typescript:类型';上不存在属性;对象';,javascript,typescript,Javascript,Typescript,我有以下设置,当我循环使用for…of时,得到一个错误: 类型“object”上不存在属性“country” 这是通过数组中的每个对象循环并比较对象属性值的正确方法吗 let countryProviders: object[]; export function GetAllProviders() { allProviders = [ { region: "r 1", country: "US", locale: "en-us

我有以下设置,当我循环使用
for…of
时,得到一个错误:

类型“object”上不存在属性“country”

这是通过数组中的每个对象循环并比较对象属性值的正确方法吗

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

您可能已经将
allProviders
键入为
object[]
。而
对象上不存在属性
国家/地区
。如果不关心键入,可以将
allProviders
countryProviders
声明为
Array

let countryProviders:Array;
让所有提供者:数组;
如果您确实需要静态类型检查。您可以为结构创建接口并使用它:

interface Provider {
    region: string,
    country: string,
    locale: string,
    company: string
}

let countryProviders: Array<Provider>;
let allProviders: Array<Provider>;
接口提供程序{
地区:字符串,
国家:字符串,
语言环境:字符串,
公司名称:string
}
让我们看看:数组;
让所有提供者:数组;

如果对象可以包含任何键/值对,则可以声明一个名为
keyable
的接口,如:

interface keyable {
    [key: string]: any  
}
然后按如下方式使用:

let countryProviders: keyable[];


是的,强烈建议使用上述方法,但如果您别无选择,并且希望继续使用“allProviders”作为对象数组,则使用此方法。这在没有创建接口的情况下对我有效

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

爱死它了!我正在寻找静态类型检查解决方案。谢谢@Saravana:)为什么不使用类来代替接口?@RafaelReyes如果您只需要对对象进行编译时类型检查,那么您可以使用接口(接口在构建过程中被擦除,不会影响生成的JS)。但是,类确实会转换为JS。基于这个问题,不需要创建类。@Saravana如果使用第三方软件包,您将如何处理这个问题。我正在使用JSforce并试图在对象上使用“search”函数,但它抛出了“类型“Connection”上不存在属性“search””…有什么线索吗?@user269867那么可能是类型定义未随库更新的情况。您可以自己添加该方法,并提出永久修复的PR(这将需要一些时间)。或者,如果您想暂时解决这个问题,可以向声明中添加属性,我认为
Record
将是更正确的解决方案。
let countryProviders: Array<keyable>;
type ProviderKey="region" | "country" | "locale" | "company"

let countryProviders: Array<Record<ProviderKey,string>>;

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