在TypeScript中编写闭包

时间:2015-09-03 15:55:17

标签: javascript typescript typescript1.5

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

function test(i){
  return Promise.resolve()
  .then(function() {
    // update the DOM
    document.getElementById('progress').innerHTML += i;
    return i;
  });
}

var loadSequence = [];
// loop through all the frames!
for (var i = 0; i < 9999; i++) {
  loadSequence.push(test(i));
}

Promise.all(loadSequence)
.then(function(){
  window.console.log('all set...');
});

这是我尝试使用TypeScript实现此目的的最佳方法:

var func = (function() {

  var private_count = 0;

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

  return increment;
}());

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

3 个答案:

答案 0 :(得分:10)

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

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

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

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

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

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

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

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

    var private_count: number = 0;

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

    return increment;
})();

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

var func = (() => {

    var private_count = 0;

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

    return increment;
})();

答案 1 :(得分:1)

我确实试过这个并且有效!

<强> file1.ts

export var Mvar = (() => {
    var private_arry = [];
    function pushfn(val):any {
      return private_arry.push(val);
    }
    function countfn():number {
      return private_arry.length;
    }
    function setfn(val):void {
      private_arry = null;
      private_arry = val;
    }
    function getfn(val?:number):any {
      if(val!==undefined) {
        return private_arry[val];
      }
      return private_arry;
    }
    return {
      push:pushfn,
      count:countfn,
      set:setfn,
      get:getfn
    }
})()

<强> file2.ts

import { Mvar } from '../../shared/file1';

ngOnInit() {

console.log("private var: " + Mvar.push("e1"));
console.log("private count: " + Mvar.count());
console.log("private get: " + Mvar.get());

...
}

答案 2 :(得分:0)

这是:

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

    var _count: number = 0;

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

        _count += 1;

        return _count;
    }

    return increment;
})();

但添加界面可以更轻松。

interface Increment {
    (): number;
}

var func = ((): Increment => {

    var _count: number = 0;

    var increment: Increment = function () {

        _count += 1;

        return _count;
    }

    return increment;
})();