娯楽のために、クロージャを含むコードで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の最も実用的な使用法ではないことは知っていますが、コンパイルエラーを修正するための考えはありますか?
コードはそのままにしておくことができます。 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;
})();
私はこれを試しました、そしてそれはうまくいきます!
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());
...
}
ここにあります:
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;
})();