【发布时间】: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