这是我来自Angular 6项目的typings.d.ts
文件:
import { Injectable, InjectableDecorator, HostBinding, HostBindingDecorator, HostListener, HostListenerDecorator } from '@angular/core';
// Those decorators are declared with `any` type by default. Because of that
// `no-unsafe-any` TSLint rule reports errors on for example `@Injectable`
// decorator. Below declarations fix that.
declare module '@angular/core' {
export interface InjectableDecorator {
(providedIn?: any | 'root' | null): ClassDecorator;
}
export const Injectable: InjectableDecorator;
export interface HostBindingDecorator {
(hostPropertyName?: string): PropertyDecorator;
}
export const HostBinding: HostBindingDecorator;
export interface HostListenerDecorator {
(eventName: string, args?: string[]): MethodDecorator;
}
export const HostListener: HostListenerDecorator;
}
// Allows to import JSON files inside TypeScript files
declare module '*.json' {
const value: any;
export default value;
}
'*.json
的最后一个声明应该允许我在TypeScript文件中导入JSON文件(更多详细信息here)。它不起作用-当我导入JSON文件时,TypeScript编译器报告错误:
ERROR in src/app/core/internationalization/build-time-translate-loader.ts(8,26): error TS2307: Cannot find module '../../../assets/i18n/translations.json'
奇怪的是,一旦我将declare module '*.json' { ... }
部分从typings.d.ts
移动到任何其他.d.ts
文件,例如json.d.ts
编译器停止抱怨,并且JSON正确导入而没有错误。当我将declare module '@angular/core' { ... }
部分移到另一个文件时,也会发生同样的情况。这让我假设问题出在两个声明中并存于一个文件中。
与TypeScript documentation相反,您可以在单个.d.ts
文件中声明多个模块:
我们可以使用顶级导出声明在自己的.d.ts文件中定义每个模块,但是将它们编写为一个更大的.d.ts文件更加方便。为此,我们使用类似于环境名称空间的构造,但是我们使用module关键字和模块的引用名称,这些名称将在以后的导入中使用。例如:
declare module "url" { export interface Url { protocol?: string; hostname?: string; pathname?: string; } export function parse(urlStr: string, parseQueryString?, slashesDenoteHost?): Url; } declare module "path" { export function normalize(p: string): string; export function join(...paths: any[]): string; export var sep: string; }
这正是我在做什么。当两个declare module
都在同一个文件中时,为什么它不起作用?
答案 0 :(得分:2)
typings.d.ts
被视为外部模块,因为它包含顶级导入。因此,文件中的每个declare module "..." { ... }
语句都被视为模块扩充,而不是模块的原始声明。由于"*.json"
的原始声明不可用,因此放弃了"*.json"
的扩充,不幸的是,在.d.ts
文件中发生此错误时,您不会收到错误;我不确定是否有充分的理由。正确的解决方案是将declare module "*.json"
放在没有顶级导入的文件中。不幸的是,这些都没有正确记录。