Я не использую Typescript уже много лет и не могу вспомнить и найти, как правильно вводить многие классы внутри оператора переключателя.
class A {}
class B {}
class C {}
type OneOfThem = A | B | C;
function test(foo: OneOfThem): string {
switch(/* something using foo */) {
/* A */:
return "A";
/* B */:
return "B";
/* C */:
return "C";
/* should not need to use "default" as all cases are handled */
}
}
Я нашел и попробовал несколько вариантов, например:
но ни один из них не работает (Function lacks ending return statement and return type does not include 'undefined').
Может быть, моя память подводит, и на занятиях это невозможно?
Если я это сделаю, средство проверки типов не предупредит меня об отсутствующем регистре, но столкнется с ошибкой во время выполнения, которую я использую машинописный текст, чтобы избежать ее, насколько это возможно.






добавление дополнительного члена к трем классам, которые будут использоваться в операторе переключения
Это действительно, вероятно, самое простое решение для вашего случая: он использует Дискриминируемый союз , добавляя дискриминантный член в каждый класс с литеральными типами (т. е. не только string или number), так что вы (и TypeScript) могу отличить foo из какого класса:
class A {
readonly kind = "a"
// ^? "a" string literal, not just `string`
}
class B {
kind: "b" = "b"
// ^? "b" string literal, as explicitly typed
}
class C {
kind = "c" as const
// ^? "c" string literal, thanks to the const assertion
}
Затем просто дифференцируйте на основе этого kind дискриминантного свойства:
function test(foo: OneOfThem): string { // Okay
switch (foo.kind) {
case "a":
foo
//^? A inferred by TS, based on `foo.kind === "a"` type guard
return "A";
case "b":
foo
//^? B
return "B";
case "c":
foo
//^? C
return "C";
/* should not need to use "default" as all cases are handled */
}
}
readonly все получилось, спасибо!
Действительно, если быть точным, вам просто нужно убедиться, что свойство дискриминанта имеет буквальные значения типа (т. е. не просто string): tsplay.dev/wXL79w В ответе я сделаю это более подробно.
Вы можете выдать ошибку в случае по умолчанию, чтобы удовлетворить исчерпывающую диагностику соответствия шаблону (пример ).