【问题标题】:Coding a closure in TypeScript在 TypeScript 中编写闭包
【发布时间】:2015-11-29 13:36:07
【问题描述】:

只是为了娱乐,我试图在包含闭包的代码中使用 TypeScript 的强类型。原始 JavaScript 代码如下所示:

var func = (function() {

  var private_count = 0;

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

  return increment;
}());

这是我用 TypeScript 实现这一点的最佳尝试:

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

  var _count: number = 0;

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

  return increment;
}());

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

【问题讨论】:

  • 您使用 IIFE 是否有特殊原因?

标签: javascript typescript typescript1.5


【解决方案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());

...
}

【讨论】:

  • 为什么要导出 IIFE?
【解决方案2】:

您可以按原样保留代码。 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;
})();

【讨论】:

    【解决方案3】:

    这里是:

    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;
    })();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 2022-07-30
      相关资源
      最近更新 更多