使用filter()thisArg编译TypeScript

时间:2015-06-03 20:55:39

标签: javascript node.js typescript

我正在使用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,或者是否有其他方法可以实现此目的。

其他信息

  1. 我使用typescript-requirerequire我的模块;
  2. 这不是我的完全实施,但它足以说明问题。
  3. TL; DR

    使用tsc filter()参数时,如何让thisArg编译我的课而不会出错?

1 个答案:

答案 0 :(得分:3)

此错误源于您已创建类级别方法filterObjects()并在另一个上下文中使用它。

TypeScript编译器不知道意图使用此方法,它决定您将在Sample上下文中使用它:sample.filterObjects()。< / p>

您至少有2个不同的选项可以解决此错误:

  1. 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;
    }
    
  2. 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);
    }
    
  3. 我建议第二个,它在语义上更好(如果filterObjects不是Sample的方法,它不应该在它上面。)