TypeScript的枚举类型在使用`import type`声明导入时无法作为值使用。

6

版本信息

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,并显示:

'Enum'无法用作值,因为它是使用'import type'导入的。

期望行为

应该允许使用导入类型中的Enums。


当我们导入时,不必在导入行中写入类型。 - Amit Rai
我正在使用 import type 来避免 ESLint 的 no-cycle 规则失败,因为我的类型导入结果来自循环依赖。 - A.N.M. Saiful Islam
2个回答

4

TS 3.8新增了 仅类型导入和导出 功能。

import type只会导入用于类型注释和声明的声明。 它始终被完全擦除,因此在运行时没有任何残留。

只需像这样导入枚举:

import { Enum } from './type';

我正在使用 import type 来避免 ESLint 的 no-cycle 规则失败,因为我的类型导入结果来自循环依赖。这是正常的,因为类型定义文件使用类文件(用于实例类型),而类文件使用类型定义文件。 - A.N.M. Saiful Islam
目前,我正在使用普通对象 as const 以及 typeof Obj[keyof typeof Obj] 作为解决方法。希望 TS 能够尽快解决枚举问题。 - A.N.M. Saiful Islam
@A.N.M.SaifulIslam 解决循环依赖的简单方法:A->B,B->A,创建另一个文件C,A->C,B->C。有什么阻止你这样做? - Lin Du
有许多这样的循环依赖(仅限于类型),为了摆脱这个问题而创建大量额外文件是没有意义的。我希望TS能够尽快本地支持它。 - A.N.M. Saiful Islam

2

在下面的链接中,我刚刚解决了你的问题:https://replit.com/@aMITrAI11/ts-import-type-enum#index.ts

  • enums.ts

注意:本文涉及IT技术相关内容。
export enum Sex {
  Male    = "male",
  Female  = "female",
}
  • type.ts
export * as Enum from "./enums";
  • index.ts
import { Enum } from "./type";

function enumTest() {
  return Enum.Sex.Male;
}

console.log(enumTest());

1
我正在使用 import type 来避免 ESLint 的 no-cycle 规则失败,因为我的类型导入结果来自循环依赖。这是正常的,因为类型定义文件使用类文件(用于实例类型),而类文件使用类型定义文件。 - A.N.M. Saiful Islam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接