gpt4 book ai didi

typescript - 在 TypeScript 的 if-else 语句中用尽枚举

转载 作者:搜寻专家 更新时间:2023-10-30 20:59:57 24 4
gpt4 key购买 nike

TypeScript(在严格模式下)将以下函数的返回类型推断为 1 |未定义:

enum E {A, B};
const f = (x: E) => {
if (x === E.A) {
return 1;
} else if (x === E.B) {
return 1;
}
}

如何确保将类型推断为数字(因为枚举已用尽)?目前我添加 ... else { throw undefined; },但这意味着如果我忘记实际用尽枚举中的所有选项,TypeScript 将无法捕获它。它适用于 switch 语句:

const g = (x: E) => {
switch (x) {
case E.A:
return 1;
case E.B:
return 1;
}
};

所以它不能与 if-else 一起使用似乎很奇怪,我觉得我遗漏了一些明显的东西。

最佳答案

根据评论中的讨论(感谢大家的投入),这是一个缺失的功能 (Github issue here)。目前唯一的解决方法是使用 ... else { ((x: never) => { throw undefined; })(x); },这很丑陋,但会确保类型被正确推断,并且如果枚举没有完全耗尽则会产生错误。

更新:实际上,我认为最好的方法是使用效用函数

export const assertNever = (arg: never): never => {
throw 'assertNever';
};

并像这样使用它:

if (value === ...) {
...
} else {
return assertNever(value);
}

或者(如果返回类型无关紧要)像这样:

if (value === ...) {
...
} else {
assertNever(value);
}

或者,在三元的情况下,像这样:

value === ...
? ...
: value === ...
? ...
: assertNever(value)

关于typescript - 在 TypeScript 的 if-else 语句中用尽枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48975236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com