Для своего приложения я использовал шаблон «Дискриминационное объединение» с проверкой исчерпываемости, как описано в руководстве по TypeScript .Прошло время, и в итоге мой коммутатор в конечном итоге содержал более 50 дел.
Итак, мой вопрос: есть ли хорошее решение для разложения этого коммутатора без торможения его исчерпывающей способностью?
Другими словами, какчтобы разделить это, если это может помочь, я могу логически разделить эти союзы на подтипы (например, формы ниже можно разделить на равносторонние и другие):
interface Square {
kind: "square";
size: number;
}
interface Rectangle {
kind: "rectangle";
width: number;
height: number;
}
interface Circle {
kind: "circle";
radius: number;
}
//... 50 more shape kinds
type Equilateral = Square | Circle /*| 25 more...*/;
type Other = Rectangle /*| 25 more...*/;
type Shape = Equilateral | Other;
function assertNever(x: never): never {
throw new Error("Unexpected object: " + x);
}
function area(s: Shape) {
switch (s.kind) {
case "square": return s.size * s.size;
case "rectangle": return s.height * s.width;
case "circle": return Math.PI * s.radius ** 2;
/*
...
... a lot of code lines
...
*/
default: return assertNever(s);
}
}