TypeScript: интерфейс или тип для одной из констант или строки - PullRequest
0 голосов
/ 16 октября 2018

Я использую 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 голосов
/ 16 октября 2018

Ошибка в том, что вы только определили ERROR_A как значение, но пытаетесь использовать его как тип.(Сообщение об ошибке бесполезно; я недавно подал проблему для ее улучшения.) Чтобы определить каждое имя как значение и тип, вы можете использовать следующее в 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;

Предложение Хайдена Холла использовать перечисление также хорошо, поскольку члены перечисления автоматически определяются как имена и типы.Но вы можете избежать всего этого и просто написать type SWITCH_ERROR = string;это эквивалентно type SWITCH_ERROR = ERROR_A | ERROR_B | ERROR_C | string, когда ERROR_A, ERROR_B и ERROR_C являются конкретными строками.

0 голосов
/ 16 октября 2018

Что-то вроде следующего должно решить проблему (если ваша ошибка - строка):

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...
  }
}
...