为什么import关键字有用?

Ban*_*San 8 javascript typescript

在typescript中我可以导入另一个模块\名称空间,如下所示:

namespace Shapes2 {
    import shapes = Shapes;

    var bar = new shapes.Bar();
}
Run Code Online (Sandbox Code Playgroud)

但是,我可以直接轻松地引用命名空间.

namespace Shapes3{
    var shapes = Shapes;

    var bar = new shapes.Bar();
}
Run Code Online (Sandbox Code Playgroud)

import做什么用?

我什么时候想打字import而不是var

Mik*_*uck 5

在那个特定的情况下,不,它没有做任何有用的事情.该语法用于为名称空间创建别名.在这种情况下,您的示例会更有用:

namespace Shapes2 {
  import Rects = Shapes.Rectangles;

  var bar = new Rects.Red();
  // Instead of `var bar = new Shapes.Rectangles.Red()`
}
Run Code Online (Sandbox Code Playgroud)

基本上,这只是减少你打字数量的一种方式.在某种程度上,它是usingC#的替代品.但这有什么不同var

这类似于using var,但也适用于导入符号的类型和名称空间含义.重要的是,对于值,import是与原始符号的不同引用,因此对别名的更改var不会反映在原始变量中.

资源

一个很好的例子可以在规范中找到:

namespace A {  
    export interface X { s: string }  
}

namespace B {  
    var A = 1;  
    import Y = A;  
}
Run Code Online (Sandbox Code Playgroud)

'Y'是非实例化名称空间'A'的本地别名.如果更改'A'的声明使得'A'成为实例化的命名空间,例如通过在'A'中包含变量声明,则上面'B'中的import语句将是一个错误,因为表达式'A'不是引用名称空间"A"的名称空间实例.

当import语句包含export修饰符时,将导出本地别名的所有含义.


Chr*_*ier 0

来自TypeScript 手册

简化命名空间使用的另一种方法是使用 import q = xyz为常用对象创建较短的名称。不要与用于加载模块的 import x = require("name") 语法混淆,该语法只是为指定的符号创建一个别名。您可以将这些类型的导入(通常称为别名)用于任何类型的标识符,包括从模块导入创建的对象。