使用 `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

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 consttypeof 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 枚举不能用作值的主要内容,如果未能解决你的问题,请参考以下文章

使用模块声明导入 JSON 文件

Import语句基础

Import语句基础

Java面向对象_封装思想——import关键字

js中import是引用同一个

打字稿。导入“模块/子目录”npm 包时未找到环境声明