条件联合类型开关类型中的打字稿类型安全性

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

我有一个简单的函数,它使用union类型和boolean作为参数,并且无法通过Typescript键入它。

我有这个代码(playground here):

type A = 'a' | 'A';

function f(a: A, b: boolean): string {
    if (b) {
        switch (a) {
            case 'a': return '';
            case 'A': return '';
        }
    } else {
        switch (a) {
            case 'a': return '';
            case 'A': return '';
        }
    }
}

编译器(启用strictNullChecks时)告诉我Function lacks ending return statement and return type does not include 'undefined'.

我真的不想添加default案例,因为这里的目标是确保当我在A中添加新类型时,我在f中正确处理它们。我不知道我错过了哪个分支。

我可以通过写作来修复它(参见链接的游乐场):

function g(a: A): string {
    switch (a) {
        case 'a': return '';
        case 'A': return '';
    }
}

function f2(a: A, b: boolean): string {
    if (b) {
        return g(a);
    } else {
        return g(a);
    }
}

(当然在现实生活中我需要两个不同的g函数,但对于打字问题,这并不重要)。

如何在不引入像f这样的中间函数的情况下让typescript编译g

typescript switch-statement union-types
1个回答
1
投票

您可以添加default案例来修复它,例如

function f(a: A, b: boolean): string {
    if (b) {
        switch (a) {
            case 'a': return '';
            case 'A':
            default: return '';
        }
    } else {
        switch (a) {
            case 'a': return '';
            case 'A':
            default: return '';
        }
    }
}

你也可以通过使用never类型来修复它,例如

function f(a: A, b: boolean): string {
    if (b) {
        switch (a) {
            case 'a': return '';
            case 'A': return '';
            default:
                const _exhaustiveCheck: never = a;
                return _exhaustiveCheck;
        }
    } else {
        switch (a) {
            case 'a': return '';
            case 'A': return '';
            default:
                const _exhaustiveCheck: never = a;
                return _exhaustiveCheck;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.