【问题标题】:Augment Angular typescript definitions增强 Angular 打字稿定义
【发布时间】:2019-01-26 07:21:44
【问题描述】:

我正在尝试为 https://github.com/niqdev/angular-q-extras 创建一个 TS 定义文件

你可以在这里找到我写的完整定义https://github.com/mistic100/DefinitelyTyped/blob/angular-q-extras/types/angular-q-extras/index.d.ts

它只包含添加到 IQService 的几个方法, 提取:

declare var _: string;
export = _;

import * as angular from 'angular';

declare module 'angular' {
    namespace angular {

        interface IQService {
            allSettled(promises): IPromise<any>;
        }  

    }
}

它很大程度上基于 Angular 插件的其他定义。

问题是我在运行DefinitelyTyped linter 或尝试使用定义时收到以下错误:

无法使用值导出来扩充模块“角度”,因为它解析为非模块实体。

还有一堆:

找不到名称“IPromise”。

我真的不明白为什么它适用于其他定义而不适用于我的定义。我可能忘记了一件显而易见的事情,但不知道是哪一件。

【问题讨论】:

    标签: angular typescript promise type-declaration


    【解决方案1】:

    回复:

    Cannot augment module 'angular' with value exports because it resolves to a non-module entity.

    既然 Angular 类型定义说:

    declare var angular: angular.IAngularStatic;
    export = angular;
    

    您不能再定义任何运行时存在的angular.foo.bar 形式的项目,例如您的枚举qextras.PromiseState,因为它们会与angular 声明的变量冲突。事实上,AFAICT、qextras.PromiseState 及其常量实际上并没有在运行时由 angular-q-extras 以这个名称定义(也许它们使用另一个名称?我不明白所有这些 Angular 的东西是如何工作的),所以它会以这种方式声明它们会产生误导。你可以做的一件事是只声明一个类型而不是枚举:

    type PromiseState = 'fulfilled' | 'rejected';
    

    您可能认为您可以使用 const enum,因为它是由 TypeScript 编译出来的,但我想仍然有人担心 const enumangular 的成员之间的表达式可能不明确编译时变量。 (编辑:confirmed by the TypeScript team。)

    看起来IPromise 错误是declare module 'angular' 未能通过的后果。

    您没有在问题中询问此问题,但在我看来,您还需要从 IQService 周围删除 namespace angular。 AIUI,即使 Angular 类型声明具有 namespace angular,您的扩充也植根于 Angular 类型声明指定为导出的内容,即 namespace angular,因此您不应嵌套另一个 namespace angular

    【讨论】:

    • 谢谢,问题确实是编译成实际 JS 的枚举,以对比联合类型。而且我也必须删除命名空间。
    猜你喜欢
    • 2017-10-23
    • 2019-06-20
    • 2017-11-15
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 2014-11-16
    • 2013-03-20
    相关资源
    最近更新 更多