我正在使用TypeScript编写Node中的应用程序,并且我希望使用filter()
根据属性过滤对象数组。我有一个公共方法(getValidObjects()
),它接受一个对象(preferred
),该对象具有我想要匹配的属性。
在我目前的设置中,我利用thisArg
将回调中的上下文设置为首选对象。
class Sample {
_objects:Object[];
_preferred:Object;
constructor() {
this._objects = [
{
valid: true,
label: 'This is valid'
},
{
valid: false,
label: 'This is invalid'
}
];
}
public getValidObjects(preferred:Object) {
return this._objects.filter(this.filterObjects, preferred);
}
private filterObjects(sample:Object, index:number, array:Object[]) {
// "this" should be the preferred object
return this.valid == sample.valid;
}
}
export = Sample;
该类最终会编译,但最后会抛出错误:
error TS2339: Property 'valid' does not exist on type 'Sample'.
它看起来像编译器窒息,因为它试图用this
对类进行类型检查。我不确定这是tsc
中的错误,它只是不知道如何处理thisArg
,或者是否有其他方法可以实现此目的。
require
我的模块; 使用tsc
filter()
参数时,如何让thisArg
编译我的课而不会出错?
答案 0 :(得分:3)
此错误源于您已创建类级别方法filterObjects()
并在另一个上下文中使用它。
TypeScript编译器不知道意图使用此方法,它决定您将在Sample
上下文中使用它:sample.filterObjects()
。< / p>
您至少有2个不同的选项可以解决此错误:
将this
投射到数组中的类型:
private filterObjects(sample:Object, index:number, array:Object[]) {
// here, Object is your type, but it can be anything else
// you have to cast to <any> first, because compiler may warn you
// that Sample can not be cast directly to your type
return (<Object><any>this).valid == sample.valid;
}
在filterObjects()
内移动getValidObjects()
声明:
public getValidObjects(preferred:Object) {
function filterObjects(sample:Object, index:number, array:Object[]) {
return this.valid == sample.valid;
}
return this._objects.filter(filterObjects, preferred);
}
我建议第二个,它在语义上更好(如果filterObjects
不是Sample
的方法,它不应该在它上面。)