扩展DefinitelyTyped定义的正确方法? (TypeScript v.2.3.4)

时间:2017-06-02 09:05:16

标签: typescript typescript-typings

经过一番研究后,我设法将我的界面IRequestShortcutConfig与@ types / angular提供的现有界面合并。 我创建了一个包含我的界面的单独文件:

// custom.d.ts
export {}; // Ensure this is treated as a module.

declare module 'angular' {
    interface IRequestShortcutConfig {
        tracker?: any;
    } 
}

第一个“专业”是根据https://github.com/Microsoft/TypeScript-Handbook/issues/258#issuecomment-213490734我们需要至少有一个顶级导出或导入语句。

  

如果您已经在ES6模块中,则只能扩充ES6模块。

为什么会这样?

我发现第二件事有点令人困惑的是,在DefinitelyTyped定义中,接口的定义如下:

declare namespace angular {
    interface IRequestShortcutConfig extends IHttpProviderDefaults {
        /**
         * {Object.<string|Object>}
         * Map of strings or objects which will be turned to ?key1=value1&key2=value2 after the url. If the value is not a string, it will be JSONified.
         */
        params?: any;

        /**
         * {string|Object}
         * Data to be sent as the request message data.
         */
        data?: any;

        /**
         * Timeout in milliseconds, or promise that should abort the request when resolved.
         */
        timeout?: number|IPromise<any>;

        /**
         * See [XMLHttpRequest.responseType]https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-responsetype
         */
        responseType?: string;

    }
}

然而,为了实际扩充命名空间接口,我们需要使用declare module 'angular'而不是declare namespace angular来包装界面,如本文问题开头的文件custom.d.ts中所示。

来自Typescript-Handbook的引用:

  

关于术语的说明:重要的是要注意在TypeScript 1.5中,命名法已经改变。 “内部模块”现在是“命名空间”。 “外部模块”现在只是“模块”,以便与ECMAScript 2015的术语保持一致(即模块X {相当于现在首选的命名空间X {)。

所以'外部'模块只是一个“已导入”的模块?

它确实有效,但我想知道这是否是通过npm安装的扩展类型(@types)的正确方法?

0 个答案:

没有答案