由于使用了私人名称,声明将不会发出。

问题描述 投票:2回答:1

我正在尝试将一个项目转换为TypeScript,我已经准备好了大部分的东西,但我仍然在努力把最后的几个部分放在一起。我希望能够从一个正常的JavaScript项目中使用这个TypesScript项目,所以我的理解是,我需要为我现有的源发出d.ts文件。我的源码目前都是.js,我们计划随着时间的推移慢慢迁移到TS。我的问题是如何用当前的exportrequire语句来导出声明。

简单演示一下这个问题。

mod1. js

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

module.exports = {
    MyClass,
};

mod2.js

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

module.exports = {
    MyClass: mod1.MyClass,
};

当我试图在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)

在我们的代码库中,我们有很多的重路由,一组组的文件中存放着各种类,然后我们在每个dir级别使用index.js文件来定义该命名空间中哪些项目是可用的,有时还有一堆UI元素,这些元素是实例化的类实例,所以我们可以进行调用,如。

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

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

javascript typescript tsc
1个回答
0
投票

解决这个问题的最好方法是导出与ES6兼容的类。MyClass 使用CommonJS格式导出,当你编写 module.exports但不是ES6格式。对于 MyClass 您可以在以下情况下进行 mod1.js:

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

module.exports = {
    MyClass,
};

或者,我推荐的方法,因为它更明显。

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

module.exports = {
    MyClass,
};

exports { MyClass };

试试这些方法,看看是否有效果。

© www.soinside.com 2019 - 2024. All rights reserved.