我正在构建一个Typescript库(捆绑到一个.js文件中)和一个使用该库的捆绑.js文件和d.ts文件的Typescript客户端应用程序
我已经使用以下代码https://github.com/jeffsim/soExportImportIssue创建了一个示例VSCode项目。您可以下载它,npm install和build来查看问题。
以下是相关代码:
// ... LibraryProject/Controls/Control.ts
export default class Control {
constructor() {
}
}
// ... LibraryProject/Controls/Label.ts
import Control from "./Control"
export default class Label extends Control {
constructor() {
super();
}
}
// ... LibraryProject/Library.ts
export default class Library {
constructor() {
}
}
上面链接的项目也有一个自定义构建环境(在this github repo中有所涉及),但我认为这与此问题无关。
库代码编译没有问题,它会生成以下d.ts文件:
declare module "Library" {
export default class Library {
constructor();
}
}
declare module "Controls/Control" {
export default class Control {
constructor();
}
}
declare module "Controls/Label" {
import Control from "Controls/Control";
export default class Label extends Control {
constructor(label: String);
}
}
我不确定这是否是我想要的d.ts的一般格式(并且那里的'import'让我感到不舒服)。即使它是正确的,我知道它仍然需要某种聚合导出,但我不确定如何定义它。在开始之前,以下是我在App中使用库的方法:
AppProject \ typings \ libraryProject.d.ts - 包含上述d.ts内容
// AppProject\Test.ts
// Although the d.ts is ambiently included and so shouldn’t need to be
// imported, as it stands above there isn’t an ‘aggregate export’ in it, so
// I may need something like this (which doesn’t work):
// import * as lib from "./typings/libraryProject";
export class Test {
constructor() {
// This doesn't work as-is; not present ambiently (since 'lib'
// isn't in the d.ts), and 'lib' isn't explicitly imported (since
// I can't get import above to work)
var v = new lib.Controls.Label("EHLO WLRD");
}
}
这导致问题 - 如何启用'lib.Controls.Label'行,同时允许库继续内部导入,如上所述?如果我手动将d.ts文件更改为以下内容,则App中的lib.Controls.Label行可以正常工作;但我无法弄清楚对图书馆的源文件做了哪些更改,以使其生成此d.ts文件并仍然如上所述工作。
declare module lib {
export class Library {
constructor();
}
}
declare module lib.Controls {
export class Control {
constructor();
}
}
declare module lib.Controls {
export class Label extends Control {
constructor(label: String);
}
}
如果我移动到命名空间,我可以让库输出那种d.ts但是我不再使用modules / import了。例如,按如下方式更改Controls.ts会生成上述d.ts格式:
namespace lib {
export class Control {
constructor() {
}
}
}
我是否应该以某种方式更改库以输出不同的d.ts文件,(2)有一个以某种方式修改d.ts文件的后处理(例如通过附加某种聚合导出),或者( 3)应用程序中是否有不同的导入线可以使用?或者我应该只使用命名空间?