“对象”类型上不存在属性“过滤器”

Posted

技术标签:

【中文标题】“对象”类型上不存在属性“过滤器”【英文标题】:Property 'filter' does not exist on type 'Object' 【发布时间】:2018-08-02 16:00:57 【问题描述】:

将我的代码更新为 HttpClient 后,我​​无法让 filter() 处理响应。我不断收到:

TS

liqOnChange(selection): void  
        this.http.get(this.json_liq).subscribe(res => 
            this.arr = res.filter(
                res => res.id == selection.target.value);
        );

【问题讨论】:

Filter 是一个数组方法。 res 是数组吗? 【参考方案1】:

filter 是一种数组方法,在您的情况下不能用于对象res

首先检查res是否是一个数组。

if(Array.isArray(res))
   this.arr = res.filter(
                res => res.id == selection.target.value);

或者将类型设置为res as (res: Array<any>)

如果你的 api 返回一个对象,在大多数情况下应该是,你不能在这里使用filter 方法,你应该将它用于res 对象内的数组。

【讨论】:

问题来自 API,感谢您指出这一点。我确信我得到了一个数组,但是在像你说的那样检查并将类型设置为数组但没有成功之后,我意识到我得到了一个里面有一个数组的对象。 @prevox 没问题【参考方案2】:

我认为您的 res 不是数组,请检查 res 的类型,如果是数组,则过滤方法有效。

【讨论】:

【参考方案3】:

对象为空或不是数组 尝试检查对象是否不为 null 并且是带有 if(res != null && Array.isArray(res))

的数组

【讨论】:

【参考方案4】:

改变这一行:

this.http.get(this.json_liq).subscribe(res => 

到这里:

this.http.get(this.json_liq).subscribe((res: any) => 

或者更好的是:

 this.http.get(this.json_liq).subscribe((res: Array<any>) => 

并且您应该能够绕过编译器的类型检查错误。

以下是来自official docs 的更多信息:

any 类型是处理现有 javascript 的强大方式, 允许您在期间逐渐选择加入和退出类型检查 汇编。您可能希望 Object 扮演类似的角色,因为它 用其他语言做。但是 Object 类型的变量只允许你 为它们分配任何值 - 你不能调用任意方法 它们,甚至是实际存在的:

let notSure: any = 4;
notSure.ifItExists(); // okay, ifItExists might exist at runtime
notSure.toFixed(); // okay, toFixed exists (but the compiler doesn't check)

let prettySure: Object = 4;
prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'.

【讨论】:

以上是关于“对象”类型上不存在属性“过滤器”的主要内容,如果未能解决你的问题,请参考以下文章

类型“IFilterComp”上不存在属性“resetFilterValues”

“对象”类型上不存在属性“成功”

Angular 4 属性在构建时类型对象上不存在

“对象”类型上不存在属性“”。可观察订阅

“对象”类型上不存在属性“id”

TypeScript 令人困惑的错误'对象可能是'未定义'和'类型上不存在属性'长度''