为什么“导出类型”需要与“--isolatedModules”一起使用?

Chr*_*isW 10 typescript type-only-import-export

我不明白发生了什么,也不明白为什么要在幕后这样做:

\n
    \n
  • 如果Something是一种类型,为什么启用export { SomeThing } from "elsewhere"时会产生错误?--isolatedModules

    \n

    相反,如果是一个值,或者如果未启用,为什么export { SomeThing } from "elsewhere"不是错误?Something--isolatedModules

    \n
  • \n
  • 为什么指定可以export type { SomeThing } from "elsewhere"修复该错误?

    \n
  • \n
\n
\n

(背景资料)

\n

TypeScript有一个新功能

\n
\n

仅类型导入和导出

\n

大多数用户可能永远不需要考虑此功能;\n但是,如果您\xe2\x80\x99在--isolatedModules、TypeScript\xe2\x80\x99s\n transpileModuleAPI 或 Babel 下遇到问题,则此功能可能相关。

\n

TypeScript 3.8 添加了仅类型导入和导出的新语法。

\n
import type { SomeThing } from "./some-module.js";\n\nexport type { SomeThing };\n
Run Code Online (Sandbox Code Playgroud)\n

import type仅导入用于类型\n符号和声明的声明。它总是被完全擦除,因此\n\n\xe2\x80\x99s 在运行时没有任何残留。同样,export type仅提供可用于类型上下文的导出,并且也是从 TypeScript\xe2\x80\x99s 输出中获取的。

\n
\n

我知道如何使用它以及何时需要它,但我不知道为什么,即显然何时启用--isolatedModules然后代码如下...

\n
import type { SomeThing } from "./some-module.js";\n\nexport { SomeThing };\n
Run Code Online (Sandbox Code Playgroud)\n

...产生编译器错误,即...

\n
Re-exporting a type when the \'--isolatedModules\' flag is provided requires using \'export type\'.ts(1205)\n
Run Code Online (Sandbox Code Playgroud)\n

...解决方法是使用export type { SomeThing }而不是export { SomeThing }.

\n

顺便说一句,显然import { SomeThing } from "./some-module.js"是可以的,不会产生错误消息,import type { SomeThing } from "./some-module.js"也不是必需的。

\n
\n

顺便说一句,这与Typescript 中的“导出类型”是什么?不是同一主题。这是关于在 2017 年实现此新功能之前定义 atype并为其添加前缀, 。export

\n

Hey*_*ude 9

这个 Babel Github 问题,其中有解释:

为了确定某个东西是否是类型,我们需要有关其他模块的信息。

import { T } from "./other-module";
export { T }; // Is this a type export?
Run Code Online (Sandbox Code Playgroud)

这个 Reddit 主题还有一个非常详细的解释:

类型空间是 TypeScript 的域:构成应用程序的所有类型。它们仅在编译时存在。编译器完成后,生成的 JavaScript 中就没有任何类型了。价值空间基本上是相反的:它是留在 JS 中并保留下来的东西。

type Foo = { bar: string };
const a: Foo = { bar: 'hello' };
Run Code Online (Sandbox Code Playgroud)

这里,Foo是在类型空间中,其他一切都在值空间中。

的问题isolatedModules是他们无法知道他们正在使用哪个空间,因为每个文件都是单独编译的。所以如果你这样做:

export { Foo } from './bar';
Run Code Online (Sandbox Code Playgroud)

在文件中,TypeScript 无法知道是否Foo 在类型空间中(如果是,它就会被丢弃,因为它不会出现在生成的 JavaScript 中),或者是否在值空间中(即它是 JS,因此它需要包含在结果输出中)。