为库的浏览器版本生成 .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 的情况下都会遇到的痛苦,因此您将找不到能够解决损坏的代码库的工具。最好修复代码库,而不是编写工具来堆积到无法维护的系统上。
我有一个用 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 的情况下都会遇到的痛苦,因此您将找不到能够解决损坏的代码库的工具。最好修复代码库,而不是编写工具来堆积到无法维护的系统上。