在Angular类型中定义多个模块的问题

时间:2018-09-19 12:53:36

标签: angular typescript typescript-typings

这是我来自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都在同一个文件中时,为什么它不起作用?

1 个答案:

答案 0 :(得分:2)

typings.d.ts被视为外部模块,因为它包含顶级导入。因此,文件中的每个declare module "..." { ... }语句都被视为模块扩充,而不是模块的原始声明。由于"*.json"的原始声明不可用,因此放弃了"*.json"的扩充,不幸的是,在.d.ts文件中发生此错误时,您不会收到错误;我不确定是否有充分的理由。正确的解决方案是将declare module "*.json"放在没有顶级导入的文件中。不幸的是,这些都没有正确记录。