关于typescript:为库的浏览器版本生成.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模块和类。我现在需要在较旧的浏览器应用程序中使用该库,该库以typescript编写,但仅使用内部模块。我设法使用汇总功能构建了该库的浏览器版本(因此污染了全局名称空间),并且在运行时运行良好!

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

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

1
2
3
4
5
6
7
8
9
10
11
12
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模块中构建该库,然后使用汇总来获得一个整体的umd文件,该文件在浏览器环境中加载时会在" window "全局变量中创建一个名为DDDTools的属性,其中包含所有导出的模块,例如这个

1
2
3
4
5
6
window.DDDTools
            +-- Promises
            +-- CommonInterfaces
            +-- Utils
            +-- DomainEvents
            +-- ...

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

由于该库是使用外部模块开发的,因此我无法使用tsc编译器生成的d.ts文件,其中包含以下内容(对于Utils模块):

1
2
3
4
5
file: Utils/index.d.ts

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

以对象迭代器为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
}

如果我将typescript源中的库用作外部模块,则这些.d.ts很好,因此我可以编写

1
2
3
4
/* 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且包含其导出的所有模块的typescript说呢?

我的第一次尝试是:

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

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

我想我需要一种创建包含如下内容的.d.ts的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
    }
}

我是对的吗?如果是的话,有没有办法使其"自动"?我尝试将tsc的模块选项设置为" system "(或amd),并使用outFile选项将所有内容输出到单个文件中,但是得到了这样的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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就能生活的痛苦,因此您将找不到解决断码库的工具。更好地修复代码库,而不是编写工具以堆积在无法维护的系统上。