Идиоматический машинописный текст Enum Discriminated Union

Начиная с машинописного текста 2.0, вы можете использовать размеченные объединения с перечислением в качестве дискриминанта следующим образом:

export function getInstance(code: Enum.Type1, someParam: OtherType1): MyReturnType1;
export function getInstance(code: Enum.Type2, someParam: OtherType2): MyReturnType2;
export function getInstance(code: Enum, someParam: UnionOfOtherTypes): UnionOfReturnTypes {
  switch (code) {
    case Enum.Type1:
      return new ReturnType1(someParam as OtherType1);
    case Enum.Type2:
      return new ReturnType2(someParam as OtherType2);
  }
}

Начиная с TypeScript 2.3

  • Это идиоматический способ сделать это?
  • Можем ли мы определить тип someParam без приведения типов?
  • Можем ли мы упростить определения типов, возможно, используя обобщения, изменив параметры функции и т. Д., Поэтому нам нужно определить только последнюю функцию?
  • Можно ли объявить функции как константы, например: const getInstance = () => {};

person chris    schedule 05.05.2017    source источник


Ответы (1)


Это идиоматический способ сделать это

Нет, если вам нужно использовать утверждение типа, например someParam as OtherType1 это небезопасно.

Более

person basarat    schedule 05.05.2017
comment
Я все время читаю вашу книгу :) спасибо! Можно ли вывести тип возвращаемого значения некоторого размеченного объединения на основе параметра? т.е. если код типа A, я знаю, что возвращаемый тип будет типом B. - person chris; 05.05.2017
comment
да. Все операторы возврата для объединения для возвращаемого типа. например если вы возвращаете string и number в разных разделах кода, предполагается, что тип возврата будет string | number ???? - person basarat; 05.05.2017