导入'找不到模块'当内部模块声明了导入时

时间:2016-02-09 11:14:40

标签: import module typescript

我有这个命名空间

namespace Validation {

    export function Func1() {
    // code
    }

    export function Func2() {
        // code
    }    
}

我可以在app.ts中导入:

import Validations = Validation;

但是当我想在我的Validation命名空间

中引用一些模块时
import {Request, Response} from 'express';
var jwt    = require('jsonwebtoken');
var express = require('express');
import {Config} from './../config';

namespace Validation {

    export function Func1() {
    // code
    }

    export function Func2() {
        // code
    }    
}

然后我import Validations = Validation;中的app.ts给了我一个错误cannot find namespace Validation

为什么会这样?有什么想法如何解决?

更新1:如果我在命名空间之后放置导入我收到错误Import declaration in a namespace cannot import a module

 namespace Validation {

import {Request, Response} from 'express'; //Error: Import declaration in a namespace cannot import a module
var jwt    = require('jsonwebtoken');
var express = require('express');
import {Config} from './../config'; //Error: Import declaration in a namespace cannot import a module

    export function Func1() {
    // code
    }

    export function Func2() {
        // code
    }    
}

我的config.ts只是一个简单的类:

export class Config {
        public static get Secret():string { return 'stuff'; }
        public static get Database():string { return 'mongodb://127.0.0.1:27019/test'; }
    }

'express'npm package

更新2 我想我只是通过将其包装到命名空间来修复配置:

namespace Common {
    export class Config { .. }
}

还将此import {Config} from './config';的导入声明更改为:import Config = Common.Config;但尚未弄清楚如何修复'express'事物

2 个答案:

答案 0 :(得分:1)

这是因为从您将顶级导入或导出语句放入文件的那一刻起,该文件就被视为外部模块本身。如果您正在使用内部模块(名称空间),我建议在名称空间内导入,这样就没有顶级导入或导出语句。

namespace Validation {
    import Request = ...;
    import Response = ...;

    export function Func1() {
    // code
    }

    export function Func2() {
        // code
    }    
}

另一种方法是使用外部模块,但这需要一个模块加载系统,在许多情况下这可能是多余的。

目前,您正在混合使用内部和外部模块,这是不推荐的。对于像这样的复杂结构案例,Typescript仍然远不是一种成熟的语言。

答案 1 :(得分:0)

我假设您已在单独的(来自app.ts)文件中定义了验证功能。如果是这种情况,那么您需要做的是:

在您的Validation.ts中:

export function Func1() {
// code
}

export function Func2() {
    // code
} 

在你的app.ts中:

import * as Validation from './Validation';

Validation.Func1();

您的问题很可能是将打字稿中的模块和命名空间的概念混合在一起。看看这里:Namespaces and Modules,请务必仔细查看ModulesNamespaces