// This statement will get erased because of import elision.import { SomeTypeFoo, SomeOtherTypeBar } from'./module-with-side-effects';
// This statement always sticks around.import'./module-with-side-effects';
// ./service.tsexportclassService {
// ...register('globalServiceId', Service);
// ./consumer.tsimport { Service } from'./service.js';
inject('globalServiceId', function(service: Service) {
// do stuff with Service
结果 ./service.js 中的代码不会被执行,导致在运行时会被中断。
在 TypeScript 3.8 版本中,我们添加了一个仅仅导入/导出 声明语法来作为解决方式。
import type { SomeThing } from"./some-module.js";
export type { SomeThing };
import type 仅仅导入被用于类型注解或声明的声明语句,它总是会被完全删除,因此在运行时将不会留下任何代码。
与此相似,export type 仅仅提供一个用于类型的导出,在 TypeScript 输出文件中,它也将会被删除。
值得注意的是,类在运行时具有值,在设计时具有类型。它的使用与上下文有关。
当使用 import type 导入一个类时,你不能做类似于从它继承的操作。
import type { Component } from"react";
interface ButtonProps {
// ...classButtonextendsComponent<ButtonProps> {
// ~~~~~~~~~// error! 'Component' only refers to a type, but is being used as a value here.// ...
如果在之前你使用过 Flow,它们的语法是相似的。
一个不同的地方是我们添加了一个新的限制条件,来避免可能混淆的代码。
// Is only 'Foo' a type? Or every declaration in the import?// We just give an error because it's not clear.import type Foo, { Bar, Baz } from"some-module";
// ~~~~~~~~~~~~~~~~~~~~~~// error! A type-only import can specify a default import or named bindings, but not both.
与 import type 相关联,我们提供来一个新的编译选项:importsNotUsedAsValues,通过它可以来控制没被使用的导入语句将会被如何处理,它的名字是暂定的,但是它提供来三个不同的选项。
// dist/types.js
--empty-- TODO or does babel remove it all together?
// lib-import-export.jsimport { createPlaylist } from"./api";
export { createPlaylist };