在 TypeScript 中编写闭包
Coding a closure in 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 是一个函数,returns 一个函数,returns 一个数字。我已将其类型设置为“()=>()=>number”,但编译器不喜欢这样。我知道这不是 TypeScript 最实用的用法,但是有没有人有修复编译错误的想法?
您可以按原样保留代码。 TypeScript 已经通过查看初始赋值确定了代码中所有变量的类型。将鼠标悬停在变量上,您将看到计算出的类型。
代码中的主要问题是func
的类型不正确。这个:
var func: () => () => number = ...
...应该是这样的:
var func: () => number = ...
请注意,不需要额外的 () =>
,因为它不是 returns 函数 returns 一个数字的函数。它只是一个returns一个数字的函数。
顺便说一句,如果您真的想明确键入所有内容,这里有另一个解决方案:
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;
})();
这里是:
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;
})();
我确实试过了,很有效!
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());
...
}
纯属娱乐,我尝试在包含闭包的代码中使用 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 是一个函数,returns 一个函数,returns 一个数字。我已将其类型设置为“()=>()=>number”,但编译器不喜欢这样。我知道这不是 TypeScript 最实用的用法,但是有没有人有修复编译错误的想法?
您可以按原样保留代码。 TypeScript 已经通过查看初始赋值确定了代码中所有变量的类型。将鼠标悬停在变量上,您将看到计算出的类型。
代码中的主要问题是func
的类型不正确。这个:
var func: () => () => number = ...
...应该是这样的:
var func: () => number = ...
请注意,不需要额外的 () =>
,因为它不是 returns 函数 returns 一个数字的函数。它只是一个returns一个数字的函数。
顺便说一句,如果您真的想明确键入所有内容,这里有另一个解决方案:
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;
})();
这里是:
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;
})();
我确实试过了,很有效!
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());
...
}