【问题标题】:Typescript Reference to external Module in NamespaceTypescript 对命名空间中外部模块的引用
【发布时间】:2017-11-15 08:35:44
【问题描述】:

我正在尝试在我的命名空间“company.controllers”中引用外部模块“moment

namespace company.controllers {    
    import { moment } from 'moment';

    'use strict'

    export class WidgetAdminDailyStatisticController extends Controller<company.data.AdminDailyStatisticViewModel> {
        customRepository: company.data.CustomRepository;
        searchDate: Date;

        static $inject: Array<string> = [
            'CustomRepository'
        ];
        constructor(
            customRepository: company.data.CustomRepository
        ) {
            super();

            this.customRepository = customRepository;
        }

        initialize(): void {
            this.searchDate = new Date();

            //let a: moment = new moment();


        }
    }
}

我收到“命名空间中的导入声明无法引用模块

如何导入时刻并在我的打字稿中使用?

【问题讨论】:

    标签: typescript momentjs typescript-typings


    【解决方案1】:

    你可以在命名空间之外导入它:

    import { moment } from 'moment';
    
    namespace company.controllers {
        // ...
    }
    

    ...但是您不能在非模块脚本中导入模块。如果您的命名空间不在模块中,则不可能。解决方案是使用 moment 作为全局变量,并为该全局变量查找(或写入)另一个定义文件。

    【讨论】:

    • 当我将它移到命名空间之外时,它可以工作。但是我在“Controller”上遇到错误。 1.“控制器”下的卷线。错误消息:“找不到名称控制器” 2. 'company.data' 下的卷线。错误消息:“命名空间‘公司’没有导出的成员数据”。以上两者之前都可以正常工作。
    • 确实如此。您不能在非模块脚本中导入模块。如果命名空间不在模块中,则不可能。解决方案是使用 moment 作为全局变量。
    • 我找到了一种方法。通过在类型定义文件中注释掉“export = moment”。
    • 抱歉,我无法验证您的版本,因为它是特定于 moment 的 hack。您需要的是 momentambient type definitions。我不知道moment 是否存在。通过删除定义文件中的export = moment 行,可以使定义文件ambient。但是这种技巧取决于定义文件的编写方式,它不是“从命名空间引用外部模块”的通用解决方案。但是,您的解决方案适合您,这是最重要的。 :)
    • 我的错。正确的术语不是 ambient 而是 global
    猜你喜欢
    • 2015-01-07
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 2016-07-17
    相关资源
    最近更新 更多