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

时间:2018-07-05 23:26:48

标签: typescript

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

index.js (在我的包装中)

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

module.exports =  MyClass;

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

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

我可以在es3中轻松使用此代码,并且可以正常工作。 (在我的包裹之外,例如从其他包裹中获取)

var myInstance = new MyClass()

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

import MyClass from 'mypackageid';

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

Typescript加载程序拒绝编译并打印:

  

TS2351:无法将“ new”与类型缺少调用的表达式一起使用   或构造签名。

编辑1

  

您在.ts文件(.d.ts文件)中使用commonjs默认导出   指定成员出口,您的消费者期望使用ES6   默认导出。您实际上以哪种方式尝试导出它?您   必须选一个

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

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

我将在下面收到错误消息。错误指向与new

对齐的行
  

S2693:“ MyClass”仅引用一种类型,但在此处被用作值。

1 个答案:

答案 0 :(得分:1)

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

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


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

new MyClass(null, null)

此外,如果您想将接口与new一起使用,则不能将其导出(因为它是一种类型),则需要声明const并导出:

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