为库的浏览器版本生成 .d.ts 文件的最快方法是什么?

What is the fastest way to generate a .d.ts file for a browser version of a library?

我有一个用 Typescript 2.3.4 编写的相当大的库,它正在导出大量 ES6 模块和 类。我现在需要在一个旧的浏览器应用程序中使用这个库,它是用打字稿编写的,但只使用内部模块。我设法使用汇总构建了该库的浏览器版本(因此污染了全局名称空间),并且在 运行 时间运行良好!

我现在的问题是在用作全局库时为库生成类型 (.d.ts)。

我的代码是从一个包含如下内容的 index.ts 文件开始编译的:

import * as Promises from "./Promises";
export { Promises };

import * as CommonInterfaces from "./CommonInterfaces";
export { CommonInterfaces };

import * as Utils from "./Utils";
export { Utils };

import * as DomainEvents from "./DomainEvents";
export { DomainEvents };
...

我在 es6 模块中构建库,然后使用 rollup 获得一个整体的 umd 文件,当在浏览器环境中加载时,该文件在 "window" 全局中创建一个名为 DDDTools 的 属性,包含所有导出的模块,像这样

window.DDDTools
            +-- Promises
            +-- CommonInterfaces
            +-- Utils
            +-- DomainEvents
            +-- ...

如果我使用内部模块(命名空间)而不是外部模块开发库,这正是我将获得的结果。

由于库是使用外部模块开发的,所以我不能使用由 tsc 编译器生成的 d.ts 文件,这些文件包含如下内容(对于 Utils 模块):

file: Utils/index.d.ts

export { ObjectIterator } from "./ObjectIterator";
export { SimpleGuid } from "./SimpleGuid";
export { SimpleIdentityMap } from "./SimpleIdentityMap";

以对象迭代器为例

file: Utils/ObjectIterator.d.ts

export interface IObjectIteratorItem {
    value: any;
    propertyNameOrIndex: string;
    parentObject: any;
}
export declare class ObjectIterator {
    private srcObject;
    private knownObjects;
    private toBeTraversed;
    private traversed;
    private currentStackItem;
    constructor(srcObject: any);
    hasNext(): boolean;
    getCurrent(): IObjectIteratorItem;
    moveNext(): void;
    reset(): void;
    private isKnownObject(obj);
    private addToKnownObjects(obj);
    private addToStack(obj);
}

这些 .d.ts 如果我在打字稿源中使用库作为外部模块就没问题,所以我可以写

/* fine, but make*/
import { ObjectIterator } from "DDDTools/Utils";  

let oi = new ObjectIterator( ... // <-- and here my editor would show all the intellisense that makes typescript really cool ;)

但是我该如何对存在一个名为 DDDTools 的全局变量并且包含它导出的所有模块的打字稿说?

我的第一次尝试是:

import * as dddtools from "DDDTools";
declare var DDDTools: dddtools;

但这使我的文件成为外部模块,而我糟糕的浏览器应用程序(包含大量文件)仍然是基于命名空间的(内部模块),不再编译。

我想我需要一种方法来创建一个 .d.ts 包含这样的东西

declare namespace DDDTools.Utils {
    export interface IObjectIteratorItem {
        value: any;
        propertyNameOrIndex: string;
        parentObject: any;
    }
    export declare class ObjectIterator {
        private srcObject;
        private knownObjects;
        private toBeTraversed;
        private traversed;
        private currentStackItem;
        constructor(srcObject: any);
        hasNext(): boolean;
        getCurrent(): IObjectIteratorItem;
        moveNext(): void;
        reset(): void;
        private isKnownObject(obj);
        private addToKnownObjects(obj);
        private addToStack(obj);
    }
}

我说得对吗?如果是,有没有办法做到 "automatically" ?我尝试使用 tsc 并将模块选项设置为 "system"(或 amd)并使用 outFile 选项将所有内容输出到单个文件,但得到的结果如下:

declare module "DDDTools/Utils/ObjectIterator" {
    export interface IObjectIteratorItem {
        value: any;
        propertyNameOrIndex: string;
        parentObject: any;
    }
    export class ObjectIterator {
        private srcObject;
        private knownObjects;
        private toBeTraversed;
        private traversed;
        private currentStackItem;
        constructor(srcObject: any);
        hasNext(): boolean;
        getCurrent(): IObjectIteratorItem;
        moveNext(): void;
        reset(): void;
        private isKnownObject(obj);
        private addToKnownObjects(obj);
        private addToStack(obj);
    }
}
... and so forth for each ES6 module I created

这真的非常接近我需要的东西,如果 declare module "DDDTools/Utils/ObjectIterator" 可以变成 declare namespace DDDTools.Utils.ObjectIterator 就好了……但你知道它不是

如有任何帮助,我们将不胜感激!

What is the fastest way to generate a .d.ts file for a browser version of a library?

最快的方法是拥抱 NPM 生态系统,让 webpack 之类的东西进行捆绑。

更多

outFile 是每个人在没有 https://basarat.gitbooks.io/typescript/docs/tips/outFile.html 的情况下都会遇到的痛苦,因此您将找不到能够解决损坏的代码库的工具。最好修复代码库,而不是编写工具来堆积到无法维护的系统上。