Основное отличие состоит в том, что Typescript Union Type на самом деле является надмножеством F # Discriminated Union.
TypeScript Union Type = Untagged тип объединения.
F # Discriminated Union = Tagged union type.
Другими словами, каждое дискриминированное объединение которые можно смоделировать в F #, можно смоделировать изоморфно в типе объединения Typescript, однако обратное неверно.
Например, следующее размеченное объединение в F #:
type a' Option = Some of 'a | None
Можно смоделировать изоморфно в Typescript как:
type Option<T> = {tag: 'Some', value: T} | {tag: 'None'}
Однако следующий тип объединения Typescript не может быть смоделирован изоморфно в F #:
type UserInput = number | string
Основное различие здесь - тип объединения TypeScript не должен быть помечен , однако тип объединения F # должен быть помечен.
Таким образом, мы видим, что TypeScript на самом деле более гибкий, чем F #, однако это не обходится без затрат, без тегов union на самом деле дырявые, что означает, что есть какое-то объединение типов, где TypeScript не сможет выполнить проверку типа.
Это похоже на то, что нетиповое лямбда-исчисление является надмножеством типизированного лямбда-исчисления, но типизированное лямбда-исчисление намного легче доказать правильно.