我正在创建一个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”仅引用一种类型,但在此处被用作值。
答案 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;
}