javascript 当类型声明文件从实现导入枚举时,循环依赖是否可接受?

6ie5vjzr  于 2023-05-21  发布在  Java
关注(0)|答案(1)|浏览(94)

假设我有一个实现文件module.ts和一个类型声明文件module.d.ts

// module.ts
import type ConfigI from 'module.d.ts';

export enum ConfigType {
  Simple,
  Complex
}

function performTask(config: ConfigI) {
  if (config.type === ConfigType.Simple)
    // ...
}
// module.d.ts
import ConfigType from 'module.ts';

export interface ConfigI {
  type: ConfigType;
}

Typescript不允许在声明文件中使用枚举,因为它们包含运行时值。我该如何重新构建它来摆脱循环依赖呢?
一个可能的解决方案是像这样声明ConfigType:

// module.d.ts
export type ConfigType = 
  0 | // Simple
  1;  // Complex
// ...

但是,这会使它变得有点困难,这取决于您希望枚举的类型是数字还是字符串。config.type === ConfigType.Simple肯定比config.type === 0更可读;您可以将ConfigType设置为字符串类型,这样可读性更好,但它会丢失数值。

6ss1mwsb

6ss1mwsb1#

您的ConfigType不是一个循环结构,因此一个简单的解决方案是将其放置在自己的模块中。当然,这需要消费者的另一种进口。
但更好的选择是不要使用枚举。没有一个标准的Javascript概念,现在的Typescript试图严格遵守ES规范。
另一个想法是使用Typescript typesystem来确保获得正确的值。可以使用keyof获取字符串名称,然后可以使用数组访问器格式Type[name]获取值

type ConfigType = {
  Simple: 0,
  Complex: 1
}

const a:keyof ConfigType = 'Complex';

const b:ConfigType['Complex'] = 1;

const c:ConfigType['Simple'] = 1; //this errors as it should be 0

Playground

相关问题