只有空函数才能使用"new"关键字调用。

9
我将尝试在我的Typescript代码中使用Foundation的Reveal插件,具体方式如下(为了易读性进行了修改):

var popup = new Foundation.Reveal($('#element'));

在编译过程中,我遇到了以下错误(最终编译成功并正常运行):

TS2350: Only a void function can be called with the 'new' keyword.

那么应该如何编写呢?

Typescript Playground - 展示问题的代码


我认为你搞混了。如果Reveal是一个返回对象的函数,为什么你还想要做一个新的if呢? - iberbeu
这是目前我唯一让它工作的方法... - Wiktor
2
根据playground中的代码,您应该执行以下操作:var popup = Foundation.Reveal($('#element'))(即不包括new)。 - Nitzan Tomer
3个回答

10

我找到了一种方法来让 TypeScript 编译器保持安静,但这会放弃类型检查(请谨慎操作)。

var popup = new (Foundation.Reveal as any)($('#element'));
更多示例:
function User2(name) {
    if (this instanceof User2) {
        this.name = name;
    }
    else {
        return new (User2 as any)(name);
    }
}

4

根据接口:

interface FoundationSitesStatic {
    Reveal(element:Object, options?:IRevealOptions): Reveal;
}

你不能使用new操作符(用于调用构造函数)来调用它。

修正方法:

var popup = Foundation.Reveal($('#element'));

5
是的,它确实编译了,但是它不起作用 :) 这就是为什么我问这个问题的原因 ;) - Wiktor
3
我认为它是有效的 JavaScript,但在 TypeScript 中无效。这也使我感到困惑,就像@Wiktor一样,因为他们说 TypeScript 是 JavaScript 的超集。但现在看起来似乎并不是这样。 - Al Kepp
是的,这个问题是... 当我使用 new 操作符调用代码时,它是正确的,但当我不使用时就会出现 bug。所以我真的只需要一种方法来让 TypeScript 编译器闭嘴。 - PandaWood

2
我想您需要这个:

我认为您需要以下内容:

interface FoundationSitesStatic {
    Reveal: new (element: Object, options?: IRevealOptions) => Reveal;
}


让你在不 sacrificing 类型安全的情况下,使用可行的方法,无需 TypeScript 错误!最初的回答:

这使得您能够在不 sacrificing 类型安全的情况下使用可行的方法!

const popup = new Foundation.Reveal($('#element'));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接