Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 与同一文件中的类型别名同名的命名空间_Typescript - Fatal编程技术网

Typescript 与同一文件中的类型别名同名的命名空间

Typescript 与同一文件中的类型别名同名的命名空间,typescript,Typescript,我遇到了一种模式,可以概括为: 导出命名空间Foo{ 导出枚举条{} } 导出类型Foo=Omit (原代码) 根据我对typescript的初步理解,我认为这是在做: 声明命名空间Foo 使用typeof Foo从该命名空间创建类型 从2中创建的类型中省略Bar,并将此类型别名为identifierFoo 到目前为止还不错,我想,但如果我错了,请纠正我。在这一点上,事情对我来说进入了神奇的领域。这是因为当从另一个文件导入Foo时,以某种方式神奇地导入了命名空间Foo,而不是类型别名Foo。我

我遇到了一种模式,可以概括为:

导出命名空间Foo{
导出枚举条{}
}
导出类型Foo=Omit
(原代码) 根据我对typescript的初步理解,我认为这是在做:

  • 声明命名空间
    Foo
  • 使用
    typeof Foo
    从该命名空间创建类型
  • 从2中创建的类型中省略
    Bar
    ,并将此类型别名为identifier
    Foo
  • 到目前为止还不错,我想,但如果我错了,请纠正我。在这一点上,事情对我来说进入了神奇的领域。这是因为当从另一个文件导入
    Foo
    时,以某种方式神奇地导入了命名空间
    Foo
    ,而不是类型别名
    Foo
    。我的问题是:

  • 第二个文件是否由于类型推断的魔力而导入了正确的
    Foo
    ,或者这里发生了什么我应该知道的事情
  • 回到声明两个
    Foo
    s的原始文件,我们有两个名称相同但没有名称冲突的东西,这有点奇怪吗?名称空间是对象而类型别名是类型这一事实是否避免了冲突
  • 这是TypeScript中的常见模式吗?这是一个好的模式吗?我应该这样写代码吗

  • 关于代码所做的事情,您的想法是正确的

  • 是的,编译器根据用法推断它是引用类型别名还是命名空间
  • 例如:

    这里,
    TodoActions
    用作类型,因此编译器知道它引用了导出的类型别名

    另一个例子:

    这里,
    TodoActions.Type.ADD\u TODO
    用于创建属性,因此编译器同样知道它引用了名称空间

    如果将鼠标悬停在VS代码中的标识符上,实际上可以看到这一点:

  • 刚开始可能会有点困惑,但这是有意为之的行为。不过,我个人会避免这样做,因为这样会造成不必要的混乱
  • 下面的文章解释了您的确切问题: