为什么import关键字很有用?

8

在TypeScript中,我可以这样导入另一个模块/名称空间:

namespace Shapes2 {
    import shapes = Shapes;

    var bar = new shapes.Bar();
}

然而,我也可以直接引用命名空间。
namespace Shapes3{
    var shapes = Shapes;

    var bar = new shapes.Bar();
}

import 有什么用处吗?

什么情况下我需要使用 import 而不是 var

2个回答

5
在这种情况下,它并没有什么用。该语法用于创建命名空间的别名。你的示例在以下情况下会更有用:
namespace Shapes2 {
  import Rects = Shapes.Rectangles;

  var bar = new Rects.Red();
  // Instead of `var bar = new Shapes.Rectangles.Red()`
}

基本上,它只是一种减少输入量的方法。在某种程度上,它是 C# 中 using 的替代品。但这与 var 有何不同呢?
这类似于使用 var,但也适用于导入符号的类型和命名空间含义。重要的是,对于值,import 是与原始符号不同的引用,因此对别名为 var 的更改不会反映在原始变量中。 来源 一个很好的例子可以在规范中找到 (点击此处)
namespace A {  
    export interface X { s: string }  
}

namespace B {  
    var A = 1;  
    import Y = A;  
}

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

当导入语句包括导出修饰符时,本地别名的所有含义都会被导出。


在你的例子中,我可以使用 var 代替,并节省三次按键。但我仍然不明白它为什么被发明出来。 - BanksySan
@ManoDestra 但是 var 也是一样的... 如果我用 var 替换 import 关键字,那么它们完全相同。不是吗? - BanksySan
@BanksySan 不是真的。如果你在命名空间中使用var,对于多个对象,那么你将不得不在每个var声明中反复编写这些冗长的命名空间。如果你只引用命名空间中的一个单独对象,那么它可能不太有用。你可以使用var,但如果你需要反复引用特定的冗长命名空间来处理众多对象,那么导入就是正确的方法。在你的用例中并不是非常有用,但在更复杂的用例中是有用的。 - ManoDestra
如果在顶部包含 path.to.namespace 的导入,则可以轻松地缩写上述内容,以避免对相同冗长命名空间的多次引用。明白吗?例如:var x1 = new abbrev.Object1(); var x2 = new abbrev.Object2(); var x3 = new abbrev.Object3(); - ManoDestra
@ManoDestra 那 var namespace = path.to.namespace 然后 var x1 = new namespace.Object1() 行不行? - BanksySan
显示剩余7条评论

0

来自TypeScript手册

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接