web-dev-qa-db-ja.com

TypeScriptでクロージャをコーディングする

娯楽のために、クロージャを含むコードで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の最も実用的な使用法ではないことは知っていますが、コンパイルエラーを修正するための考えはありますか?

9
MatthewScarpino

コードはそのままにしておくことができます。 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;
})();
9
David Sherret

私はこれを試しました、そしてそれはうまくいきます!

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

...
}
1
Laquio

ここにあります:

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