Рекурсивные дискриминируемые союзы в машинописном тексте

#typescript

Вопрос:

Каков был бы наилучший способ моделирования дискриминируемых союзов в Typescript, где в идеале одно из полей имеет тип, ссылающийся на сам союз? Чтобы привести простой пример

 interface Base {
    kind: string;
    someOtherCommonField?: any;
}

interface A extends Base {
    kind: "A";
    children: Base[]; // This ideally would be TheNode[], but I can't forward declare the union (can I?)
}

interface B extends Base {
    kind: "B";
    fieldB: number;
}

type TheNode = A | B;

function makeNode(): TheNode {
    return {kind: "A", children: []};
}

const a = makeNode();

if (a.kind === "A") {
    for (let c of a.children) {
        if (c.kind === "A") {
            c.children // This is an error

            // c needs a cast to A because A#children has type Base[]
            const ca = c as A;
            ca.children // This works but how can I avoid casting?
        }
    }
}
 

Ответ №1:

Да, вы можете отправить объявление о союзе, как и любой другой type

ДЕМОНСТРАЦИЯ

Комментарии:

1. Ну, это было легко, я даже не пробовал ^.^’. Спасибо