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 |
这真的很接近我的需要,如果只有
任何帮助将不胜感激!
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就能生活的痛苦,因此您将找不到解决断码库的工具。更好地修复代码库,而不是编写工具以堆积在无法维护的系统上。