将 --isolatedModules 与 TS 3.2.2 一起使用时无法重新导出类型

Posted

技术标签:

【中文标题】将 --isolatedModules 与 TS 3.2.2 一起使用时无法重新导出类型【英文标题】:Cannot re-export a type when using the --isolatedModules with TS 3.2.2 【发布时间】:2019-05-12 16:26:21 【问题描述】:

我可能需要重新考虑我们构建 React 组件的方式。我们正在使用允许使用 Typescript 的最新 react-scripts,默认情况下,isolatedModules 正在启用,这目前让我有点烦恼。

我们曾经这样构造一个组件:

Component
|_ Component.tsx
|_ index.ts
|_ types.ts
Component.tsx 包含没有声明的实际组件

index.ts 只是重新导出所有内容,因此我们可以拥有一个单一的入口点,并且可以执行类似import Component, ComponentType from '@/Component'; 之类的操作

types.ts 保存实际的类型定义并导出大部分或全部。

到目前为止一切顺利,没有isolatedModules 也能正常工作。但是,我们还导出了一些类型定义,有效地重新导出了在Component/types.ts 中指定的接口。这将不起作用,因为 TypeScript 本身不会再转译代码。

如何在没有单独的导入语句转到 @/Component/types 的情况下重新导出它(这实际上可能是更简单的方法)?

【问题讨论】:

【参考方案1】:

我个人使用相同的结构,并在转到强制执行isolatedModulescreate-react-app 样板后偶然发现了相同的问题。与isolatedModules 背后的想法形成鲜明对比的解决方法是在index.ts 中使用export * from "./Component";

【讨论】:

【参考方案2】:

TS 3.8+

您可以将type-only imports and exports 与--isolatedModules 一起使用:

// types.ts
export type MyType =  a: string; b: number; ;
// main.ts 

// named import/export
import type  MyType  from './types'
export type  MyType 

// re-export
export type  MyType  from './types'

// namespace import
import type * as MyTypes from "./types";
export type RenamedType = MyTypes.MyType;
export  MyTypes ;

//     ^ Note the "type" keyword in statements above

Example Playground;查看PR 了解可能的扩展表格和建议。


TS 3.7 或更早版本

在以前的版本中,以下是不可能的:

import  MyType  from './types'; 
export  MyType ; // error: Cannot re-export a type with --isolatedModules

export  MyType  from "./types"; // error, like above

类型再导出必须使用workaround:

import  MyType as MyType_  from "./types";
export type MyType = MyType_;

// or
export * from "./types"

【讨论】:

注意:以上功能在 Babel 中支持以v7.9.0开头

以上是关于将 --isolatedModules 与 TS 3.2.2 一起使用时无法重新导出类型的主要内容,如果未能解决你的问题,请参考以下文章

为啥任何导入都修复了 --isolatedModules 错误?

为啥 TypeScript compilerOptions 'noEmitOnError: true' 和 'isolatedModules: false' 不兼容?

使用 Create React App 和 TypeScript 进行 Jest 测试时的 isolatedModules 错误?

尝试将 vue 与 ts-node 一起使用

如何将已定义的接口与 io-ts 库一起使用?

需要将 fabricjs.d.ts 与 TypeScript 一起使用的示例