增强角度打字稿定义

时间:2018-08-20 07:38:24

标签: angular typescript promise type-declaration

我正在尝试为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”。

我真的不明白为什么它适用于其他定义而不适用于我的定义。我可能忘了一件明显的事情,但无法弄清楚哪一件。

1 个答案:

答案 0 :(得分: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 enum与其中的成员之间的表达式可能不明确angular变量在编译时。 (编辑:confirmed by the TypeScript team。)

似乎IPromise的错误是由于declare module 'angular'无法通过而导致的。

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