Export was Not Found

TypeScript

在使用 TypeScript + Webpack 的项目中,可能会遇到如下类似的报错:

WARNING in ./src/xxx.tsx 346:0-62
"export 'xxx' was not found in './xxxx'

这类报错出现的情况是,在 ./scr/xxx.tsx 文件中,先 import 了一个类型定义,然后又将这个类型定义重新 export 出去了。产生报错的原因在于,TypeScript 的文件需要通过 loader(无论是 babel-loader 还是 ts-loader)转化成 Webpack 可识别的 JavaScript 文件。在转化之后,TypeScript 中定义的纯类型(如 interface)都丢失了。正因为这些类型丢失了,在试图重新 export 的时候,Webpack 就无法找到对应的定义,只能报错(Warning)了。

可以考虑通过以下的方案避免警告:

  1. 将所有的类型定义放到单独的文件(比如 types.ts 中),然后通过 export * from 'types.ts' 一次性将所有内容 export 出去(这样可以避免具体声明需要 export 的内容);
  2. 重新在当前文件中定义一个类型,然后将这个类型 export 出去:
import { Type as _Type } from './type';
export type Type = _Type;

在 TypeScript 3.7 之前,上面的代码可以简写为:

import { Type } from './type';
export type Type = Type;

在 3.7 及之后的版本中,必须保证新定义的类型名称和原来的类型名称不同。这是因为在 TypeScript 3.7 中对类型定义做了调整,在提供更强大的递归引用类型功能的同时,不再允许定义同名的类型。相关的介绍,可以查看官方的发布文档