【发布时间】:2016-08-16 23:28:19
【问题描述】:
我想创建一个包含单个值的超级棒的容器类。
let a = new Container(42);
我想得到这样的值
a(); // 42
并像这样设置值
a(43);
有没有办法在 TypeScript 中实现这一点?
【问题讨论】:
-
听起来像是属性的用途。
标签: javascript function scope typescript closures
我想创建一个包含单个值的超级棒的容器类。
let a = new Container(42);
我想得到这样的值
a(); // 42
并像这样设置值
a(43);
有没有办法在 TypeScript 中实现这一点?
【问题讨论】:
标签: javascript function scope typescript closures
JavaScript / TypeScript 不正确支持运算符重载。 如果你试图调用一个类,你不能定义被调用的函数(除了构造函数)。
【讨论】:
有没有办法在 TypeScript 中实现这一点?
为什么不呢。因为它可以用纯 JavaScript 完成,它也应该很容易在 TypeScript 中实现。与函数几乎一样,scope 是我们方法的关键字。
那么,构造函数当然会被误用为闭包,而不会创建可以响应的类型,例如Container 通过 typeof 运算符。这样的工厂函数只会返回另一个函数,然后将其用作构造函数封闭初始值的 getter/setter。
TypeScript 示例 ...
class Container {
constructor(storageValue: any) {
return (function (value: any) {
if (arguments.length !== 0) {
storageValue = value;
}
return storageValue;
});
}
}
...在纯 JavaScript 中...
var Container = (function ContainerClass () {
var Constructor = (function Container (storageValue) {
return (function (value) {
if (arguments.length !== 0) {
storageValue = value;
}
return storageValue;
});
});
return Constructor;
}());
var a = new Container(24);
console.log("a() : ", a()); // 24
console.log("a(4) : ", a(4)); // 4
console.log("a() : ", a()); // 4
var b = new Container(72);
console.log("b() : ", b()); // 72
console.log("b(5) : ", b(5)); // 5
console.log("b() : ", b()); // 5
console.log("a() : ", a()); // 4
【讨论】:
arguments.length===0 代替if (UNDEFINED_VALUE !== value) { 可能会更好,因为a() 和a(undefined) 是两个不同的东西。
any 放在任何地方,那么使用 TypeScript 是没有意义的。
Container 中的类型。从它给出的例子可以假设Number。