class の振る舞い + union の網羅性チェックが両立する class Cart { readonly status = "cart" as const; #items: ReadonlyArray<Item>; confirm(): ConfirmedOrder { return new ConfirmedOrder(this.#items); } } class ConfirmedOrder { readonly status = "confirmed" as const; #items: ReadonlyArray<Item>; #confirmedAt: Date; ship(addr: VerifiedAddress): ShippedOrder { /* ... */ } } class ShippedOrder { readonly status = "shipped" as const; } type Order = Cart | ConfirmedOrder | ShippedOrder;