Typescript:可以在树中的更高级别别名一个模块,而不是另一个模块的别名?

时间:2014-04-02 21:28:46

标签: typescript

我已经设置了以下模块结构:

module A.B.C.D {
  var ajaxLibNS = ajaxLibNS || A.B.1;
  var appUtilNS = appUtilNS || A.B.2;
  var appUtil = appUtil || new appUtilNS.AppUtil(); //a class that may be found in module A.B.2

  export class SomeClass implements ISomeInterface {
    //region properties
    private ajaxResponse: ajaxLibNS.IAjaxResponse;
  }
}

当我编译时,编译器抱怨,"错误TS2095:找不到符号' ajaxLibNS'"

我不明白为什么编译器不会同样抱怨appUtilNS,因为它存在于模块层次结构中的类似位置(即,"两个级别,一个")。然而,编译器没有抱怨,创建appUtil的代码运行得很好。

请有人照亮我吗?谢谢!

1 个答案:

答案 0 :(得分:1)

这是您所看到的简化版本:

module A {
    export class Foo {}
}

module B1 {
    var f = A.Foo;
    var x = new f(); // OK
    var y: f; // Error, can't find symbol f
}

问题在于,在此示例中,f仅存在于命名空间中。 TypeScript有两种不同的名称:类型和值。在编写类型注释时,您需要在类型命名空间中查找;在表达式上下文中,您将查找值命名空间。 var声明对类型命名空间没有贡献。

但是,

import声明会提供导入名称的两个含义。所以,你可以写这个:

module B2 {
    import f = A.Foo; // Change 'var' to 'import'
    var x = new f(); // OK
    var y: f; // OK
}

请注意,此处生成的代码相同;这只是将A.Foo的类型名称转换为f