我有一个用 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 模块中构建库,然后使用汇总获取一个整体 umd 文件,该文件在浏览器环境中加载时会在“窗口”全局中创建一个名为 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);
}
}
我对吗 ?如果是的话,有没有办法让它“自动”?我尝试使用 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
......但你知道它不是
任何帮助将不胜感激!