我已经很多年没有使用 Typescript 了,不记得也找不到如何在 switch 语句中正确键入保护许多类。
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 */
}
}
我发现并尝试了几个选项,例如:
foo.constructor
instanceof
但它们都不起作用(
Function lacks ending return statement and return type does not include 'undefined'
)。
我的记忆是否在作弊,而这在课堂上是不可能的?
向要在 switch 语句中使用的三个类添加一个额外的成员
这确实可能是适合您的情况的最简单的解决方案:它使用Discriminated Union,通过向每个类添加一个discriminant成员,以便您(和TypeScript)可以区分
foo
来自哪个类:
class A {
readonly kind = "a"
// ^? "a" string literal, not just string
}
class B {
readonly kind = "b"
}
class C {
readonly kind = "c"
}
然后简单地根据这个
kind
判别属性进行区分:
function test(foo: OneOfThem): string { // Okay
switch (foo.kind) {
case "a":
foo
//^? A
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 */
}
}