typescript 我怎样才能让完全的switch case语句具有一致返回?

hi3rlvi2  于 2023-02-25  发布在  TypeScript
关注(0)|答案(4)|浏览(269)

我有这样的代码:

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

这是详尽无遗的,我有一个eslint规则来确保详尽无遗。
对于eslint/typescript,我把consistent-return规则设置为on,在这个过程中它会抱怨.我 * 不 * 想添加一个默认值(b/c如果我添加了一个新的冰淇淋口味,我希望开发人员必须处理它),但是consistent-return没有意识到这是详尽的,并且会抱怨.
你觉得我该怎么优雅地处理这件事?

juzqafwq

juzqafwq1#

好吧,我知道问题出在哪了。
consistent-return来自eslint,它不知道类型,因此没有“修复”consistent-return的好方法来了解这一点。
可能更好的方法是禁用consistent-return,然后使用typescript-lintexplicit-function-return-type甚至no-unsafe-return之类的。
因为将整个代码库移到强类型函数中的代价会非常高,所以可以贡献一个tslint规则来执行consistent-return,它 * do * 知道类型,但是如果使用ts,可能只需要删除consistent-return.

sq1bmfud

sq1bmfud2#

你可以通过加上never return来表示穷尽。

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

    const _exhaustiveCheck: never = flavors;
    return _exhaustiveCheck;
}
cig3rfwq

cig3rfwq3#

可能太晚了,以帮助操作,但对任何未来的读者:TS配置选项noImplicitReturns提供ESLint的consistent-returns的所有优点,同时还支持穷举开关/等,因为它是类型感知的。
供参考:

  • https://blog.logrocket.com/exploring-advanced-compiler-options-typescript/#noimplicitreturns
  • https://www.typescriptlang.org/tsconfig#noImplicitReturns
6ss1mwsb

6ss1mwsb4#

我建议另一种方法:

function (flavors: IceCreamFlavor): 'like'|'dislike' {
    let flavor: string = '';
    
    switch (flavors) {
      case IceCreamFlavor.vanilla:
        flavor = 'dislike';
        break;
      case IceCreamFlavor.chocolate:
        flavor = 'like';
        break;
    }

    return flavor;
}

相关问题