我正在创建一个 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' 仅指一种类型,但在此处用作值。
如果您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)
| 归档时间: |
|
| 查看次数: |
4018 次 |
| 最近记录: |