首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在TypeScript中编写闭包

在TypeScript中编写闭包
EN

Stack Overflow用户
提问于 2015-09-03 23:55:17
回答 3查看 19.4K关注 0票数 9

只是为了好玩,我尝试在包含闭包的代码中使用TypeScript的强类型。下面是原始JavaScript代码的样子:

代码语言:javascript
复制
var func = (function() {

  var private_count = 0;

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

  return increment;
}());

下面是我用TypeScript实现这一点的最好尝试:

代码语言:javascript
复制
var func: ()=>()=>number = (function(): ()=>number {

  var _count: number = 0;

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

  return increment;
}());

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-04 01:17:59

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

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

代码语言:javascript
复制
var func: () => () => number = ...

...should是这样的:

代码语言:javascript
复制
var func: () => number = ...

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

顺便说一句,如果您真的想显式地输入所有内容,这里有另一个解决方案:

代码语言:javascript
复制
var func: () => number = (() => {

    var private_count: number = 0;

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

    return increment;
})();

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

代码语言:javascript
复制
var func = (() => {

    var private_count = 0;

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

    return increment;
})();
票数 17
EN

Stack Overflow用户

发布于 2015-09-04 01:21:15

这就是它:

代码语言:javascript
复制
var func = ((): () => number => {

    var _count: number = 0;

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

        _count += 1;

        return _count;
    }

    return increment;
})();

但是添加一个接口会让它更容易。

代码语言:javascript
复制
interface Increment {
    (): number;
}

var func = ((): Increment => {

    var _count: number = 0;

    var increment: Increment = function () {

        _count += 1;

        return _count;
    }

    return increment;
})();
票数 1
EN

Stack Overflow用户

发布于 2018-03-22 13:16:31

我确实试过了,它起作用了!

文件1.ts

代码语言:javascript
复制
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
    }
})()

文件2.ts

代码语言:javascript
复制
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());

...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32380345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档