1

我有一个用 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......但你知道它不是

任何帮助将不胜感激!

4

1 回答 1

0

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

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

更多的

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

于 2017-08-24T04:36:15.113 回答