Типографское объединение методов класса имеет тип никогда для аргумента

#javascript #typescript #casting

Вопрос:

В проекте машинописи, над которым я работаю, у меня есть три отдельных класса A, B и C, между которыми есть тип объединения с именем X.

 type X = A | B | C
 

У всех A, B и C есть .move() метод, и этот метод принимает два параметра: node и position . position имеет тип Position , но node имеет другой тип объединения в зависимости от того, принадлежит ли метод к A, B или C. Класс A может принимать значение «слева» или «справа» node , но класс B может принимать значение «сверху» или «снизу» node . Когда у меня есть переменная foo типа X и я пытаюсь вызвать .move() ее, в ней говорится, что «Аргумент типа string не может быть присвоен параметру типа never». Есть ли какая-либо типизация или рефакторинг, которые я могу сделать, чтобы устранить эту проблему?

ИЗМЕНИТЬ: Вот несколько упрощенных кодов, которые отображают это поведение. Не обращайте внимания на ошибку, что foo используется до его назначения, здесь важна ошибка, относящаяся к аргументу to.

 class A {
    move(node: "top" | "bottom") {

    }
}

class B {
    move(node: "left" | "right") {

    }
}

type X = A | B

let foo: X

foo.move("top")
 

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

1. Пожалуйста, приведите воспроизводимый пример

2. На мобильном телефоне так что не могу проверить. Вам просто нужно let foo = new A(); foo.move("top")? или сделать move методы статичными. Это может означать never , что они являются классами, но вы не действуете в соответствии с экземплярами. Что касается рефакторинга, вы можете использовать enum типы вместо объединения, и move() тогда все методы будут использовать один и тот же тип аргумента, что и другие.