TypeScript:常量或字符串之一的接口或类型

时间:2018-10-16 07:32:49

标签: typescript typescript-typings typescript-types

我正在使用TypeScript开发应用程序。我正在尝试创建一个接口(或类型),该接口是多个常量之一或随机字符串。

用于描述我要构建的伪代码:

contants.ts

export const ERROR_A = "Error A";
export const ERROR_B = "Error B";
export const ERROR_C = "Error C";

types.ts

type SWITCH_ERROR = ERROR_A | ERROR_B | ERROR_C | string

我知道每个字符串都可能是一个错误。我想要这样做的原因是,这样可以轻松维护代码库,并且每个已知错误都有其类型。稍后将在switch语句中处理该错误:

switchExample.ts

export const someFunc(error: SwitchError): void => {
  switch(error) {
    case ERROR_A:
      // Do something
    // ... continue for each error.
    default:
      // Here the plain string should be handled.
  }
}

问题是我尝试这样做:

import { ERROR_A } from "./some/Path";

export type SwitchError = ERROR_A;

但这会引发错误:

[ts] Cannot find name 'ERROR_A'.

我在做什么错?如何在TypeScript中设计类似这样的东西?还是这个不好的设计?如果是,我还能怎么做?

2 个答案:

答案 0 :(得分:1)

类似以下内容应该可以解决问题(假设您的错误是字符串):

enum Errors {
    ERROR_A = 'Error A',
    ERROR_B = 'Error B',
    ERROR_C = 'Error C',
}

function handleError(error: string) : void {
  switch(error) {
    case Errors.ERROR_A:
      // Handle ERROR_A
    case Errors.ERROR_B:
      // Handle ERROR_B
    case Errors.ERROR_C:
      // Handle ERROR_C
    default:
      // Handle all other errors...
  }
}

答案 1 :(得分:1)

该错误是因为您仅将ERROR_A定义为一个值,但是您试图将其用作类型。 (错误消息没有帮助;我最近提交了an issue进行了改进。)要将每个名称都定义为值和类型,可以在constants.ts中使用以下内容:

export const ERROR_A = "Error A";
export type ERROR_A = typeof ERROR_A;
export const ERROR_B = "Error B";
export type ERROR_B = typeof ERROR_B;
export const ERROR_C = "Error C";
export type ERROR_C = typeof ERROR_C;

Hayden Hall建议使用枚举也很好,因为枚举成员会自动定义为名称和类型。但是您可以避免所有这些,而只需写type SWITCH_ERROR = string;当type SWITCH_ERROR = ERROR_A | ERROR_B | ERROR_C | stringERROR_AERROR_B是特定的字符串时,它等效于ERROR_C