我正在创建一个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文件中使用commonjs默认导出,.d.ts文件指定了成员导出,并且您的使用者希望使用ES6默认导出。您实际上以哪种方式尝试导出它?你必须选一个
我没有显式导入类型,我希望打字稿能够自动从“ index.d.ts”自动检测类型。如果我这样使用默认导出:
declare module 'mypackageid' {
interface MyClass {
new (div: HTMLElement, conf: any): MyClass;
}
export default MyClass
}
我将在下面收到错误消息。错误指向new
S2693:“ MyClass”仅引用一种类型,但在此处被用作值。
如果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)
另外,如果您想使用带有的接口new
,那么该接口不能作为导出(因为它是一种类型),则需要声明aconst
并导出该接口:
declare module 'mypackageid' {
interface MyClassCtor {
new (div: HTMLElement, conf: any) : {};
}
const MyClass : MyClassCtor;
export = MyClass;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句