【问题标题】:Factory function in a Typescript declares file, with and without the new keywordTypescript 中的工厂函数声明文件,带有和不带有 new 关键字
【发布时间】:2017-06-25 00:09:01
【问题描述】:

以下代码将在 ES5 中创建工厂函数:

function MyClass(val) {
    if (!(this instanceof MyClass)) {
        return new MyClass(val);
    }

    this.val = val;
}

可以使用或不使用new 关键字来调用此函数:

var a = new MyClass(5);
var b = MyClass(5);

这在 Typescript 中运行良好,但是我不知道如何使用描述这两种行为的 merging 创建声明文件。有没有办法做到这一点?

【问题讨论】:

  • 您有什么特别需要的原因吗?我的意思是,我知道它可以工作,但是你是否有理由不只是说“我要从现在开始在 TypeScript 中定义它,这只是一个 newable 对象”,并定义它因此?这些静态工厂大多令人困惑,并没有真正帮助任何实际的抽象。
  • 有几个不同的论点,主要的一个是忘记new 关键字是错误的常见来源,但它们都是有争议的。但为了更直接地回答您的问题,这是一个声明文件,它描述了一个现有库,对于该库,删除工厂签名是一项重大更改。这在未来可能会改变,但现在不能。实际上还有另一个 SO question (stackoverflow.com/q/32807163/907125) 询问有关在打字稿中执行此操作的问题,但他们建议我专门为声明重新发布它。
  • 那是公平的,我昨天试了一下,但做不到,所以在两天内 ping 我没有得到答案,我会在上面发布赏金: )

标签: javascript typescript ecmascript-5


【解决方案1】:
interface MyClass {
  val: {};     
}

interface MyClassConstructor {
  (val: {}): MyClass;
  new (val: {}): MyClass;
}

declare const MyClass: MyClassConstructor;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-18
    • 2013-09-24
    • 2021-02-18
    • 1970-01-01
    • 2014-03-19
    • 2011-10-16
    • 2019-12-29
    相关资源
    最近更新 更多