我正在尝试为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”。
我真的不明白为什么它适用于其他定义而不适用于我的定义。我可能忘了一件明显的事情,但无法弄清楚哪一件。
答案 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 }}。