首页 > 解决方案 > 如何在打字稿类型定义中使用常量?

问题描述

我的应用程序中有一个文件,其中包含一个名为 ui-constants.ts 的常量列表

内容如下:

export const NO_STATUS = 'NOSTATUS';
export const DRAFT_STATUS = 'DRAFT';
export const AWAITING_TRIAGE_STATUS = 'AWAITINGTRIAGE'
export const COMPLETE_NOT_REQUIRED_STATUS = 'COMPLETENOTREQUIRED';
export const UNASSIGNED_STATUS = 'UNASSIGNED';

在我的 reactjs 应用程序的其他地方,我有一个文件,我尝试在其中使用它:

import * as UI_CONSTANTS from '../constants/ui-constants';

 type RequestStatus =
    | 'NOSTATUS'
    | 'DRAFT'
    | 'AWAITINGTRIAGE'
    | 'COMPLETENOTREQUIRED'
    | 'UNASSIGNED';

现在,问题是我拿起的应用程序有点乱,在某些地方使用常量,在其他地方使用类型。我想做的是使用类型中的常量,即

 type RequestStatus = UI_CONSTANTS.NO_STATUS | UI_CONSTANTS.DRAFT_STATUS | UI_CONSTANTS .AWAITING_TRIAGE_STATUS | UI_CONSTANTS.COMPLETE_NOT_REQUIRED_STATUS 

这样做会导致以下错误:

ui-constants"' 没有导出成员 'NO_STATUS'.ts(2694)

这种情况的背景是,我有一个开发人员不满意在源代码中使用字面值应该是常量,而其他人则认为应该使用类型。

我正在研究是否可以通过定义常量和在哪里使用类型来实现两全其美,将这些常量指定为这些类型的值。

这是可以实现的还是我做错了?

标签: reactjstypescript

解决方案


试试这个:

import * as UI_CONSTANTS from '../constants/ui-constants';

type RequestStatus = typeof UI_CONSTANTS[keyof typeof UI_CONSTANTS]

const a: RequestStatus = 'NOSTATUS' // OK
const b: RequestStatus = 'DRAFT' // OK
const c: RequestStatus = 'TEST' // Error

推荐阅读