TypeScript:默认情况下,对于实例级方法,使用labmdas是一个好习惯吗?

时间:2016-04-22 17:09:25

标签: javascript c# lambda typescript this

我相信I understand difference以及在TypeScript类中使用lambdas而不是'regular'函数的影响。 要点是lambdas保留'this'并且特别是如果类方法可以'传递',重新定位等等,它们应该被使用。

作为有C#背景的人,我的问题是: 我应该总是默认并且更喜欢将Lambda用于类方法吗? 再一次,我期待大多数人会说'这取决于',但我在最佳实践,安全和理智默认情况下提出这个问题。

为了便于说明,这里有一个示例TypeSrcript类及其在ES6和ES5中的用法:

//
// ...following class in TypeScript:
//
export default class AppConfig {
    private _configFilePath: string;    

    public constructor(configFilePath: string) {
         this._configFilePath = configFilePath;
        // do stuff...
    }

    // getter for private instance field
    public get configFilePath(): string { return this._configFilePath; };   

    // override toString using lambda
    public toString = (): string => {
        return `App Config: (config file: "${this._configFilePath}")`;
    }

    // override toString using 'regular' function 
    // the '2' toString2() at the end is just to make it compile and demo 
    public toString2(): string {
        return `App Config: (config file: "${this._configFilePath}")`;
    }   
}


//
// transpiles to following when targeting ES6:
//
class AppConfig {
    constructor(configFilePath) {
        this.toString = () => {
            return `App Config: (config file: "${this._configFilePath}")`;
        };
        this._configFilePath = configFilePath;
    }

    get configFilePath() { return this._configFilePath; };  

    toString2() {
        return `App Config: (config file: "${this._configFilePath}")`;
    }

}

//
// and transpiles to following when targeting ES5:
//
var AppConfig = (function () {
    function AppConfig(configFilePath) {
        var _this = this;
        this.toString = function () {
            return "App Config: (config file: \"" + _this._configFilePath + "\")";
        };
        this._configFilePath = configFilePath;
   }

    Object.defineProperty(AppConfig.prototype, "configFilePath", {
        get: function () { return this._configFilePath; },
        enumerable: true,
        configurable: true
    });
    ;   

    AppConfig.prototype.toString2 = function () {
        return "App Config: (config file: \"" + this._configFilePath + "\")";
    }; 
}());       

1 个答案:

答案 0 :(得分:0)

通常,我只会默认使用箭头函数来处理程序和其他预期传递并从其他上下文调用的回调。

箭头函数的问题在于它们不是类函数,它们是分配给匿名函数的类属性,因此您将丢失所有类函数功能:重载,覆盖子类并调用super等等。