为现有的带有JSDOC注释的commonJS库创建Typescript声明文件

问题描述

我遇到一个问题,我无法使用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)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...