问题描述
我遇到一个问题,我无法使用Typescript 4.0解决方案来为commonjs格式的jsdoc带注释的javascript库创建声明文件(d.ts)。
如果在运行Typescript编译器以创建d.ts文件时需要多个模块中的一个或多个对象,则会出现此错误:
index.js:1:1 - error TS9006: Declaration emit for this file requires using private name 'Rectangle' from module '"/Users/gabry/projects/ts-test/rectangle"'. An explicit type annotation may unblock declaration emit.
1 const {Rectangle} = require('./rectangle');
~~~~~
Found 1 error.
我可以通过在angle.js中的类之前添加“导出”来“修复”它,但是那样代码在node.js下就无法运行了。
我已经看到打字稿中有一个类似https://github.com/microsoft/TypeScript/issues/9865的错误,应该在打字稿4.1 beta中解决,但在安装该版本的打字稿时我也遇到了同样的问题,也许是因为我使用commonjs require / module.exports的方式?
以下是示例:
index.js
const {Rectangle} = require('./rectangle');
class Render {
constructor() {
/**
* Object list
* @type {Rectangle[]}
*/
this.objects = [];
}
/**
* Adds a rectangle
*
* @returns {Rectangle} the rect
*/
addRectangle() {
const obj = new Rectangle();
this.objects.push(obj);
return obj;
}
}
module.exports = { Render }
rectangle.js
class Rectangle {
constructor() {
console.log("I'm a rectangle!");
}
}
module.exports = { Rectangle };
这是 tsconfig.json :
{
// Change this to match your project
"files": ["index.js"],"compilerOptions": {
"allowJs": true,"declaration": true,"emitDeclarationOnly": true,"outDir": "types","strict": false
}
}
我尝试添加/更改大量的tsconfig.json参数(目标,模块,模块分辨率...),但未成功...
我可以从带有节点的简单测试脚本中运行它而不会出现问题:
test.js
const {Render} = require("./index");
let render = new Render();
render.addRectangle();
console.log("Objects",render.objects);
node test.js
...按预期返回:
I'm a rectangle!
Objects [ Rectangle {} ]
解决方法
现在在 typescript 4.1 的发布版本中修复了这个问题,它确实是 typescript 编译器的一个错误,在只发出声明时发生,typescript 4.1 的第一个 beta 仍然有这个错误,但每晚都有一个问题开始修复(详细历史记录请参见原始问题中的错误),最终在 npm 注册表上发布了最终有效的 v4.1。
所以如果有人仍然遇到这个问题,它可以简单地将他的打字稿依赖更新到最新的稳定版本(^4.1)。