Можете ли вы использовать переменные для свойств интерфейса? - PullRequest
1 голос
/ 26 мая 2019

Допустим, у меня есть классический пример дискриминируемого союза:

interface Circle {
  type: 'circle';
  radius: number;
}
interface Square {
  type: 'square';
  width: number;
}
type Shape = Circle | Square;

А потом я кидаю его в корпус переключателя:

switch (shape.type) {
  case 'circle':
    ...
  case 'square':
    ...
}

Можно ли использовать переменные, чтобы позволить мне ссылаться на дискриминант в единственном числе?

Ответы [ 2 ]

0 голосов
/ 26 мая 2019

Вы можете определить константы.Их типы будут выведены как буквальные типы.Затем вы можете использовать оператор typeof, чтобы получить тип переменной:

const circle = 'circle';
const square = 'square';

interface Circle {
  type: typeof circle;
  radius: number;
}
interface Square {
  type: typeof square;
  width: number;
}

type Shape = Circle | Square;
declare const shape: Shape;

switch (shape.type) {
  case circle:
    // ...
  case square:
    // ...
}

Детская площадка

0 голосов
/ 26 мая 2019

Вы можете использовать enum.В машинописном тексте переменные используются только в качестве значений, тогда как строки могут выступать как переменные, так и типы (например, «круг»).См. Объявление слияние для получения дополнительной информации.

Однако перечисления также действуют как переменные и типы, поэтому в приведенном выше примере вы можете создать перечисление следующим образом:

enum ShapeType {
  Circle = 'circle',
  Square = 'square',
}

и соответственно заменить тип в интерфейсе, например:

interface Circle {
  type: ShapeType.Circle;
  radius: number;
}

и ссылаться на enum в регистре переключателя (например, case ShapeType.Circle:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...