TS2351:如何在 ts 中为 `new function()` 创建构造函数类型

dea*_*908 7 typescript

我正在创建一个 npm 包,它默认导出一个类。这个模块是用es3写的,但是我想提供types.ts

index.js(在我的包中)

function MyClass(p1, p2) {
  // code
}

module.exports =  MyClass;
Run Code Online (Sandbox Code Playgroud)

好的,然后我创建了类型index.d.ts(在我的包中,除了 index.js):

declare module 'mypackageid' {
  interface MyClass {
    new (div: HTMLElement, conf: any): MyClass;
  }
  export var MyClass: MyClass;
}
Run Code Online (Sandbox Code Playgroud)

我可以轻松地在 es3 中使用此代码并且它有效。(在我的包裹之外,例如来自另一个包裹)

var myInstance = new MyClass()
Run Code Online (Sandbox Code Playgroud)

但是如果我想从 .ts 文件中的另一个包中使用它:

import MyClass from 'mypackageid';

new MyClass(divReference, { // <-- error points to this line
    onBlobPaste: e=> {
      console.log(e);
    },
});
Run Code Online (Sandbox Code Playgroud)

打字稿加载器拒绝编译和打印:

TS2351:不能对类型缺少调用或构造签名的表达式使用“new”。

编辑 1

您在 .ts 文件中使用了 commonjs 默认导出,您的 .d.ts 文件指定了一个成员导出,而您的使用者期望使用 ES6 默认导出。您实际尝试以何种方式导出它?你必须选择一个

我没有明确导入类型,我希望打字稿能够从“index.d.ts”中自动检测类型。如果我使用这样的默认导出:

declare module 'mypackageid' {
  interface MyClass {
    new (div: HTMLElement, conf: any): MyClass;
  }
  export default MyClass
}
Run Code Online (Sandbox Code Playgroud)

我会在下面得到错误。错误指向符合new

S2693:'MyClass' 仅指一种类型,但在此处用作值。

Tit*_*mir 3

如果您exports=在模块中使用该方法,从而替换模块的整个导出,则您将需要使用import=, 以及支持此功能的模块系统(例如 AMD 或 commonjs)。查看文档

mypackageid.d.ts
declare module 'mypackageid' {
    class MyClass {
        constructor(div: HTMLElement, conf: any);
    }
    export = MyClass;
}


//Usage
import MyClass = require('mypackageid')

new MyClass(null, null)
Run Code Online (Sandbox Code Playgroud)

另外,如果您想使用 的接口new,则不能导出(因为它是一种类型),您需要声明 aconst并导出:

declare module 'mypackageid' {
    interface MyClassCtor {
        new (div: HTMLElement, conf: any) : {};
    }
    const MyClass : MyClassCtor;
    export = MyClass;
}
Run Code Online (Sandbox Code Playgroud)