#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()
тогда все методы будут использовать один и тот же тип аргумента, что и другие.