需要有关创建打字稿 public 类型定义的策略的指导

need guidance on strategy for creating typescript public type definitions

我正在寻求有关为 aurelia 框架创建 public 类型定义的指导 - aurelia on github here / aurelia website here / aurelia typescript samples on github

我正在为以下模式而苦苦挣扎:

typescript 编译器不允许在通过相对外部模块名称引用外部模块的环境外部模块声明中进行导出声明

存储库使用 systemjs 和 jspm 来解析 aurelia 元数据。我想使用环境模块声明来公开 aurelia-metadata

中的类型

我想要实现的实际上与将 origin.d.ts、resource-type.d.ts 和 metadata.d.ts 的内容复制到 [=37 中的环境模块声明中一样=].

请注意 ./metadata/index.js 基本上通过其导出发布 public 接口,而这正是我想在环境模块声明中公开的内容

我可以放弃并手动将信息从编译器生成的 origin.d.ts、资源-type.d.ts 和 metadata.d.ts 复制到环境模块声明中,但一直在努力寻找一种仅公开 index.d.ts 中导出的内容的方法,因为这是 repo 中模块的 public api。

手动方法的问题是已经有 20 多个库,它们将继续增长,如果无法使用编译器更新 api,我将永远跟踪更改回购协议并手动更新 api。

我相信每个 repo 的 public api 必须是环境模块,因为相应导入的实际路径(在本例中为 aurelia-metadata)是使用 systemjs 加载程序(使用 jspm 管理模块依赖关系)

假设你有origin.d.ts

declare module 'aurelia/origin' {
    export class Origin {
    }
}

您可以将其导入/再导出为 aurelia.d.ts

/// <reference path="./origin/origin.d.ts"/>
declare module 'aurelia' {
    export * from 'aurelia/origin';
}

使用情况验证:

/// <reference path="./aurelia"/>

import {Origin as Origin1} from "aurelia/origin";
import {Origin as Origin2} from "aurelia";

注意:确切答案取决于您希望如何使用 Typescript 中的定义。

追踪到这里:https://github.com/Microsoft/TypeScript/issues/2516#issuecomment-87509666