如何构建Typescript库代码来生成可以由Typescript app使用的d.ts文件?

时间:2017-01-06 18:12:08

标签: typescript

我正在构建一个Typescript库(捆绑到一个.js文件中)和一个使用该库的捆绑.js文件和d.ts文件的Typescript客户端应用程序

  • 我想使用TS模块而不是TS名称空间,除非这些目标不可能
  • 在库的代码中,我想引用库中的库对象 其他文件直接;例如“新标签(...)”
  • 在使用该库的应用程序中,我希望能够通过嵌套和单个命名空间引用库对象;例如“新 lib.Controls.Label()“
  • 我想自动生成d.ts文件

我已经使用以下代码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)应用程序中是否有不同的导入线可以使用?或者我应该只使用命名空间?

0 个答案:

没有答案