【问题标题】:Can I extend a function in TypeScript?我可以在 TypeScript 中扩展函数吗?
【发布时间】:2016-08-16 23:28:19
【问题描述】:

我想创建一个包含单个值的超级棒的容器类。

let a = new Container(42);

我想得到这样的值

a(); // 42

并像这样设置值

a(43);

有没有办法在 TypeScript 中实现这一点?

【问题讨论】:

  • 听起来像是属性的用途。

标签: javascript function scope typescript closures


【解决方案1】:

JavaScript / TypeScript 不正确支持运算符重载。 如果你试图调用一个类,你不能定义被调用的函数(除了构造函数)。

【讨论】:

  • 确实没有真正的操作重载,但你仍然可以做一些——当然是有限的——类似于操作重载here an example的东西。
【解决方案2】:

有没有办法在 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 是没有意义的。
  • 我让 OP 决定要存储在 Container 中的类型。从它给出的例子可以假设Number。
猜你喜欢
  • 1970-01-01
  • 2017-05-14
  • 2022-12-03
  • 2013-03-11
  • 2014-02-06
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多