Max*_*ber 1 typescript istanbul typescript-eslint
我写了很多使用穷举检查的代码。
在下面的代码中,_exhaustivenessCheck如果有人添加到UnitOfTime联合中,带有will(故意)的行会出现类型错误。我喜欢这种编程风格,但是当结合代码覆盖率和强大的 linter 时,它变得很痛苦:
function waterFrequencyToMilliseconds(unitOfTime: UnitOfTime): number {
switch (unitOfTime) {
case 'days':
return number * ONE_DAY;
case 'weeks':
return number * ONE_WEEK;
}
/* istanbul ignore next */
// eslint-disable-next-line
const _exhaustivenessCheck: never = unitOfTime;
}
Run Code Online (Sandbox Code Playgroud)
我需要告诉伊斯坦布尔和 eslint 在我做正确的事情时让我一个人呆着。
有没有一种标准的方法来处理这种情况,而不必添加“忽略”和“禁用”注释或完全关闭 lint 规则或代码覆盖率?
对于至少要回溯到 TS 3.1.6(我可以轻松测试的最早版本)的 TypeScript,您不需要添加像
const _exhaustivenessCheck: never = unitOfTime;
Run Code Online (Sandbox Code Playgroud)
对于switch函数中的最终语句,如果它们被编译器视为详尽无遗。也就是说,这里没有错误:
function waterFrequencyToMilliseconds(number: number, unitOfTime: UnitOfTime): number {
switch (unitOfTime) {
case 'days': {
return number * ONE_DAY;
}
case 'weeks': {
return number * ONE_WEEK;
}
}
}
Run Code Online (Sandbox Code Playgroud)
而如果你的switch陈述不是详尽无遗的,你会得到一个错误:
function oopsWaterFrequencyToMillis(number: number, unitOfTime: UnitOfTime): number {
// error! function lacks ending return statement --------------------------> ~~~~~~
switch (unitOfTime) {
case 'days': {
return number * ONE_DAY;
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,对于此处列出的特定示例代码,您应该删除详尽检查。
此外,从 TypeScript 3.7 开始,TypeScript更好地支持通过控制流分析检测不可达性,因此您不需要显式throw或return在编译器发现您处于代码不可达部分的任何情况下,例如在详尽的switch陈述。有关更多信息,请参阅实现此操作的拉取请求中的此评论。
因此,不仅不需要明确的详尽检查,这样的检查实际上会在 TS3.7+ 中产生不可达警告:
function explicitExhaustiveCheck(number: number, unitOfTime: UnitOfTime): number {
switch (unitOfTime) {
case 'days': {
return number * ONE_DAY;
}
case 'weeks': {
return number * ONE_WEEK;
}
}
const _exhaustivenessCheck: never = unitOfTime; // error!
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//unreachable code detected.
}
Run Code Online (Sandbox Code Playgroud)
因此,您绝对应该删除该检查。
如果您需要支持旧版本的 TS 并且您的示例代码表明需要进行显式穷举检查,您可能希望用显式return语句替换变量声明,例如return assertNever(unitOfTime)where assertNever()only accepting neverarguments。这可能会让你的短毛猫快乐。但就目前而言,没有此类问题的可重现示例,我认为所提出的问题已尽我所能回答。