在TypeScript中编写闭包

Mat*_*ino 5 javascript typescript typescript1.5

只是为了娱乐,我试图在包含闭包的代码中使用TypeScript的强类型.这是原始JavaScript代码的样子:

var func = (function() {

  var private_count = 0;

  var increment = function() {
    private_count += 1;
    return private_count;
  }

  return increment;
}());
Run Code Online (Sandbox Code Playgroud)

这是我使用TypeScript实现此功能的最佳尝试:

var func: ()=>()=>number = (function(): ()=>number {

  var _count: number = 0;

  var increment: ()=>number = function(): number {
    _count += 1;
    return _count;
  }

  return increment;
}());
Run Code Online (Sandbox Code Playgroud)

func是一个返回一个返回数字的函数的函数.我已将其类型设置为'()=>()=> number',但编译器不喜欢它.我知道这不是TypeScript最实际的用法,但有没有人有任何修复编译错误的想法?

Dav*_*ret 11

您可以按原样保留代码.TypeScript已经通过查看初始赋值来确定代码中所有变量的类型.将鼠标悬停在变量上,您将看到它所找到的类型.

代码中的主要问题是类型func不正确.这个:

var func: () => () => number = ...
Run Code Online (Sandbox Code Playgroud)

......应该是这样的:

var func: () => number = ...
Run Code Online (Sandbox Code Playgroud)

请注意,不需要额外的() =>因为它不是返回返回数字的函数的函数.它只是一个返回数字的函数.


顺便说一句,如果你真的想明确输入所有内容,这是另一个解决方案:

var func: () => number = (() => {

    var private_count: number = 0;

    var increment: () => number = () => {
        private_count += 1;
        return private_count;
    };

    return increment;
})();
Run Code Online (Sandbox Code Playgroud)

但我建议只使用隐式类型(只要它们不是隐式any类型),但这只是个人偏好:

var func = (() => {

    var private_count = 0;

    var increment = () => {
        private_count += 1;
        return private_count;
    };

    return increment;
})();
Run Code Online (Sandbox Code Playgroud)