TypeScript闭包 - 一个"几乎"解

时间:2015-06-17 10:42:26

标签: javascript typescript closures

我对TypeScript最大的一个问题是,它将所有方法(无论访问修饰符)编译为原型。

示例

class Example {
    public getString(): string {
        return "Hello World";
    }

    private getNumber(): number {
        return 123;
    }
}

众所周知,访问修饰符仅在编译时检查,因此被发出的JavaScript忽略。 JavaScript开发人员学会减轻这种情况的一种方法是使用闭包(好吧,我们知道使用闭包会有性能损失,但我相信有些情况下绝对需要关闭)。

示例

var Example = (function () {
    function Example() {
        this.getString = function () {
            return "Hello World";
        }

        var getNumber = function() {
            return 123;
        }
    }

    return Example;
})();

以上示例尊重公共/私人访问。

通过使用lambda语法,我们可以在TypeScript中声明公共闭包方法。

示例

class Example {
    getString = (): string => {
        return "Hello World";
    }
}

它不是特别漂亮,但它确实有效。

我想知道的是:我如何在TypeScript中声明私有闭包?

示例

class Example {

    // TypeScript doesn't like this!
    var getNumber = (): number => {
        return 123;
    }
}

在此处查看有关此问题的详情:https://github.com/Microsoft/TypeScript/issues/2940

2 个答案:

答案 0 :(得分:6)

TypeScript为ES6带来了类型和访问器(并且它会静态检查)。 TypeScript中的class关键字是ES6中的标准class关键字。 ES6课程中没有私人关闭。在ES6中,此语法有效:

class Example {
    var v = /* ... */; // invalid in ES6
}

如果需要声明封装变量的闭包,则应使用经典的JavaScript方法。我强烈建议利用TS接口:

interface NamedObject {
    getName(): string;
}

let createNamedObject = function (name = 'John'): NamedObject {
    return {
        getName: function () {
            return name;
        }
    };
};

let obj: NamedObject = createNamedObject();

如果你真的希望使用闭包创建类方法,你可以这样做:

class BadPerformance {
    public getName: () => string;

    constructor(name = 'John') {
        this.getName = () => {
            return name;
        };
    }
}

答案 1 :(得分:1)

  

众所周知,访问修饰符仅在编译时检查,因此被发出的JavaScript忽略。

这是因为此上下文中的隐私是来自其他开发者的API的隐私。如果您希望他们知道该方法是私有的 - 请为他们提供{ "error":{ "code":400, "message":"Unrecognized value (visited,relevance), allowed values are ( recent, visited, visited-hour, visited-today, visited-week, visited-month, commented, commented-hour, commented-today, commented-week, commented-month, rated, rated-hour, rated-today, rated-week, rated-month, relevance, random, ranking, trending, old, live-audience ) for `sort' parameter", "type":"invalid_parameter" } } 文件,以便他们的编辑可以知道或不在API文档中记录它。

在JavaScript中,文档通常被视为API。

  

我想知道的是:我如何在TypeScript中声明私有闭包?

您可以在构造函数中创建函数,这些函数将在实例上而不是在原型上声明它们。这将允许您使用闭包 - 它也违背了原型继承以及TypeScript和JavaScript的本质。