使用 `import type` 声明导入时,TypeScript 枚举不能用作值
Posted
技术标签:
【中文标题】使用 `import type` 声明导入时,TypeScript 枚举不能用作值【英文标题】:TypeScript enums cannot be used as a value when imports using the `import type` declaration 【发布时间】:2021-09-22 02:53:37 【问题描述】:????版本信息
TypeScript v4.1.3 Node.js v10.23.1 linux/amd64
⏯ REPL 链接
https://replit.com/@AnmSaiful/ts-import-type-enum
????代码
// ---- enums.ts ----
export enum Sex
Male = "male",
Female = "female",
// ---- type.ts ----
export * as Enum from "./enums";
// ---- index.ts ----
import type Enum from "./type";
function enumTest(): Enum.Sex
return Enum.Sex.Male;
console.log( enumTest() );
????实际行为
它不允许使用组合导入类型中的 Enum 并说:
“枚举”不能用作值,因为它是使用“导入类型”导入的。
????预期行为
它应该允许使用来自导入类型的枚举。
【问题讨论】:
导入的时候不用在导入行写type 我使用import type
来避免ESLint 的no-cycle
规则失败,因为我的类型导入是循环依赖的结果。
【参考方案1】:
TS 3.8 添加Type-Only Imports and Export 功能。
import type
仅导入用于类型注释和声明的声明。 它总是会被完全擦除,因此在运行时不会有任何残留。
只需像这样导入枚举:
import Enum from './type';
【讨论】:
我使用import type
来避免ESLint 的no-cycle
规则失败,因为我的类型导入是循环依赖的结果。这是正常的,因为类型定义文件使用了类文件(针对实例类型),而类文件使用了类型定义文件。
目前,我使用普通对象 as const
和 typeof Obj[ keyof typeof Obj]
作为解决方法。希望 TS 能尽快解决枚举问题。
@A.N.M.SaifulIslam 解决循环依赖的简单方法:A->B,B->A,创建另一个文件C,A->C,B->C。是什么阻止你这样做?
有很多这样的循环依赖(仅针对类型),仅仅为了摆脱这个问题,为单一目的创建大量附加文件是没有意义的。我希望 TS 能尽快原生支持它。【参考方案2】:
刚刚在下面的链接中解决了您的问题 https://replit.com/@aMITrAI11/ts-import-type-enum#index.ts
// ---- enums.ts ---- 导出枚举 Sex
男性 = “男性”, 女=“女”,
// ---- type.ts ---- 从“./enums”导出*为枚举;
// ---- index.ts ---- 从“./type”导入枚举;
函数枚举测试()
返回 Enum.Sex.Male;
console.log(enumTest());
【讨论】:
我使用import type
来避免ESLint 的no-cycle
规则失败,因为我的类型导入是循环依赖的结果。这是正常的,因为类型定义文件使用了类文件(针对实例类型),而类文件使用了类型定义文件。以上是关于使用 `import type` 声明导入时,TypeScript 枚举不能用作值的主要内容,如果未能解决你的问题,请参考以下文章