switch 语句中的类型保护类

问题描述 投票:0回答:1

我已经很多年没有使用 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 */
    }
}

我发现并尝试了几个选项,例如:

但它们都不起作用(

Function lacks ending return statement and return type does not include 'undefined'
)。

我的记忆是否在作弊,而这在课堂上是不可能的?

typescript class switch-statement deno typeguards
1个回答
0
投票

向要在 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 */
    }
}

游乐场链接

© www.soinside.com 2019 - 2024. All rights reserved.