typescript - 与同一文件中的类型别名同名的命名空间
问题描述
我遇到了一个可以概括为的模式:
export namespace Foo {
export enum Bar {}
}
export type Foo = Omit<typeof Foo, 'Bar'>
(这里的原始代码。)根据我对打字稿的基本理解,我认为这样做是:
- 声明一个命名空间
Foo
- 考虑
typeof Foo
从该命名空间创建一个类型。 - 从 2 中创建的类型中省略
Bar
,并将此类型别名为 identifierFoo
。
到目前为止一切都很好,我认为,但如果我错了,请纠正我。在这一点上,事情进入了我的魔法领域。这是因为当Foo
从另一个文件导入时,不知何故神奇地Foo
导入了命名空间,而不是类型别名Foo
。我的问题是:
- 由于类型推断魔术,第二个文件是否导入了正确的文件,
Foo
或者我应该知道这里发生的其他事情? - 回到声明两个
Foo
s 的原始文件,我们有两个同名的东西没有名称冲突,这很奇怪吗?命名空间是对象而类型别名是类型这一事实是否避免了冲突? - 这是 TypeScript 中的常见模式吗?这是一个很好的模式吗?我应该写这样的代码吗?
解决方案
关于代码在做什么,您的想法是正确的。
- 是的,编译器会根据用法推断它是引用类型别名还是命名空间。
在这里,TodoActions
用作类型,因此编译器知道它引用了导出的类型别名。
在这里,TodoActions.Type.ADD_TODO
用于创建属性,因此编译器再次知道它引用了命名空间。
如果您将鼠标悬停在 VS Code 中的标识符上,您实际上可以看到这一点:
- 和 3.) 一开始可能有点令人困惑,但这是预期的行为。不过,我个人会避免它,因为它会引起不必要的混乱。
以下文章解释了您的确切问题:https ://www.typescriptlang.org/docs/handbook/declaration-files/deep-dive.html
推荐阅读
- python - 我想在 Django 中将视图中的数据操作到/渲染(html)
- javascript - jQuery在php文件之外工作不工作
- python - 编辑曲面图上的轴外观
- xml - Vim、自动缩进、xml 和自动关闭标签
- python - onnx_to_keras:“NotImplementedError:无法修改此类数据”
- python - 用于 ML 管道的自定义转换器
- javascript - 表格未显示 ajax 数据
- elasticsearch - Elasticsearch 重新索引卡住了
- c++ - MFC DrawText,垂直,DT_CALCRECT with lf_escapement = 900
- c - Microsoft C 运行时中的 msvcp140_1.dll 和 msvcp140_2.dll 文件是什么?