由于私有名称的使用,声明不会发出

ice*_*itz 6 javascript typescript tsc

我正在尝试将一个项目转换为 TypeScript,并且我已经设置了大部分内容,但我仍在努力将最后几部分放在一起。我希望能够从普通的 JavaScript 项目中使用这个 TypesScript 项目,所以我的理解是我需要为我现有的源发出 d.ts 文件。我的源目前都是 .js,我们计划随着时间的推移慢慢迁移到 TS。我的问题是让声明与当前的导出/要求语句一起发出。

问题的简单演示:

mod1.js

class MyClass {
    constructor(name) {
        this.name = name;
    }
}

module.exports = {
    MyClass,
};
Run Code Online (Sandbox Code Playgroud)

mod2.js

const mod1 = require('./mod1');

module.exports = {
    MyClass: mod1.MyClass,
};
Run Code Online (Sandbox Code Playgroud)

一旦我尝试在 mod2 中导出 MyClass 以重新路由一个可以在使用项目时访问 MyClass 的命名空间,我就会得到 Declaration emit for this file requires using private name 'MyClass' from module '"mod1"'. An explicit type annotation may unblock declaration emit.ts(9006)

我们的代码库中有很多重新路由,包含各种类的文件组,然后我们在每个目录级别使用 index.js 文件来定义该命名空间中哪些项目可用,有时还有一堆 UI 元素它们是实例化的类实例,因此我们可以进行如下调用:

const {app, appui} = require('our-cool-app');
app.feature1.doSomething();
appui.component.someButton.click();
Run Code Online (Sandbox Code Playgroud)

是否有一个简单的修复方法可以让我们的 d.ts 文件从 .js 源自动生成?

小智 9

@type我通过在有问题的内容上方添加 JSDoc 注释来解决了类似的问题。就我而言,我有一个具有 getter 的类,它返回不同的类,并且 getter 的任何使用都会给出此错误。YMMV。

所以这...

// File Foo.js
class Foo {
  get Bar() {
    return Bar;
  }
}
class Bar {};

// File Blah.js
const Foo = require('./Foo.js');
class Blah extends Foo.Bar {}      <--- Error would be here
Run Code Online (Sandbox Code Playgroud)

就这样固定了...

/**
 * @type Class
 */
get Bar() {
  return Bar;
}
Run Code Online (Sandbox Code Playgroud)


Arc*_*tor 3

解决这个问题的最好方法是导出具有 ES6 兼容性的类;MyClass编写时使用 CommonJS 格式导出module.exports,而不是 ES6 格式。MyClass您可以在 中执行以下操作之一mod1.js

export class MyClass {
    constructor(name) {
        this.name = name;
    }
}

module.exports = {
    MyClass,
};
Run Code Online (Sandbox Code Playgroud)

或者,我推荐的方式,因为它更明显:

class MyClass {
    constructor(name) {
        this.name = name;
    }
}

module.exports = {
    MyClass,
};

exports { MyClass };
Run Code Online (Sandbox Code Playgroud)

尝试其中一种,看看是否能得到结果。