如何通过详尽的 switch-case 语句获得一致的返回?

Wil*_*iao 14 typescript eslint typescript-eslint

我有这样的代码:

function (flavors: IceCreamFlavor): 'like'|'dislike' {
    switch (flavors) {
        case IceCreamFlavor.vanilla:
            return 'dislike';
        case IceCreamFlavor.chocolate:
            return 'like';
    }
}
Run Code Online (Sandbox Code Playgroud)

这是详尽的,我有一个 eslint 规则来确保详尽。

对于 eslint / typescript,我将consistent-return规则切换为打开,在此期间会抱怨。我不想添加默认值(b/c,如果我添加新的冰淇淋口味,我希望开发人员必须处理它),但一致性返回并没有意识到这是详尽无遗的,并且会抱怨。

关于如何优雅地处理这个问题有什么想法吗?

Wil*_*iao 11

好吧,我通过我的问题找到了问题所在。

consistent-return来自 eslint,它不知道类型,因此没有很好的方法来“修复”一致返回来了解这一点。

可能更好的方法是禁用consistent-return然后使用typescript-lintexplicit-function-return-type什至no-unsafe-return类似的东西。

因为将整个代码库转移到强类型函数的成本确实很高,所以您可以贡献一个 tslint 规则来了解类型consistent-return,但如果您使用 ts,您可能只想删除consistent-return.


9da*_*dan 3

您可以通过添加neverreturn 来表示详尽性。

function (flavors: IceCreamFlavor): 'like'|'dislike' {
    switch (flavors) {
        case IceCreamFlavor.vanilla:
            return 'dislike';
        case IceCreamFlavor.chocolate:
            return 'like';
    }

    const _exhaustiveCheck: never = flavors;
    return _exhaustiveCheck;
}
Run Code Online (Sandbox Code Playgroud)