我怎样才能获得接受TypeScript详尽性检查的工具,而不需要很多注释?
我写了很多使用穷尽性检查的代码 在下面的代码中,如果有人添加到UnitOfTime联合中,则带有_defactVenesCheck的行将故意出现类型错误。我喜欢这种编程风格,但如果再加上代码覆盖率和强大的过梁,这将成为一种痛苦:我怎样才能获得接受TypeScript详尽性检查的工具,而不需要很多注释?,typescript,istanbul,typescript-eslint,Typescript,Istanbul,Typescript Eslint,我写了很多使用穷尽性检查的代码 在下面的代码中,如果有人添加到UnitOfTime联合中,则带有_defactVenesCheck的行将故意出现类型错误。我喜欢这种编程风格,但如果再加上代码覆盖率和强大的过梁,这将成为一种痛苦: function waterFrequencyToMilliseconds(unitOfTime: UnitOfTime): number { switch (unitOfTime) { case 'days': return number *
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;
}
当我做正确的事情时,我需要告诉伊斯坦布尔和埃斯林特让我一个人呆着
有没有一种标准的方法来处理这种情况,而不必添加忽略和禁用注释,或者完全关闭lint规则或代码覆盖率?对于至少返回到TS 3.1.6(我可以轻松测试的最早版本)的TypeScript,您不需要添加明确的穷尽性检查,如
const _exhaustivenessCheck: never = unitOfTime;
对于函数中的final switch语句,如果编译器认为它们是穷举的。也就是说,这里没有错误:
function waterFrequencyToMilliseconds(number: number, unitOfTime: UnitOfTime): number {
switch (unitOfTime) {
case 'days': {
return number * ONE_DAY;
}
case 'weeks': {
return number * ONE_WEEK;
}
}
}
然而,如果switch语句不完整,则会出现错误:
function oopsWaterFrequencyToMillis(number: number, unitOfTime: UnitOfTime): number {
// error! function lacks ending return statement --------------------------> ~~~~~~
switch (unitOfTime) {
case 'days': {
return number * ONE_DAY;
}
}
}
因此,对于这里列出的特定示例代码,您应该删除您的穷尽性检查
此外,自TypeScript 3.7以来,TypeScript具有以下特性:在编译器发现您处于代码的不可访问部分的任何情况下,例如在穷举开关语句之后,都不需要显式抛出或返回。有关更多信息,请参阅实现此功能的pull请求中的
因此,不仅不需要显式的穷尽性检查,这样的检查实际上会在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.
}
所以你一定要取消这张支票
如果您需要支持旧版本的TS,并且您的示例代码显示需要显式的穷尽性检查,那么您可能希望使用诸如return AssertNeverUnitTime之类的显式返回语句替换变量声明,其中assertNever仅接受never参数。这可能会让你的门楣感到高兴。但就目前而言,没有一个可复制的例子来说明这一问题,我认为我所提出的问题已经尽我所能得到了回答
对于TypeScript,至少可以追溯到TS 3.1.6,这是我可以轻松测试的最早版本,您不需要添加明确的穷尽性检查,如
const _exhaustivenessCheck: never = unitOfTime;
对于函数中的final switch语句,如果编译器认为它们是穷举的。也就是说,这里没有错误:
function waterFrequencyToMilliseconds(number: number, unitOfTime: UnitOfTime): number {
switch (unitOfTime) {
case 'days': {
return number * ONE_DAY;
}
case 'weeks': {
return number * ONE_WEEK;
}
}
}
然而,如果switch语句不完整,则会出现错误:
function oopsWaterFrequencyToMillis(number: number, unitOfTime: UnitOfTime): number {
// error! function lacks ending return statement --------------------------> ~~~~~~
switch (unitOfTime) {
case 'days': {
return number * ONE_DAY;
}
}
}
因此,对于这里列出的特定示例代码,您应该删除您的穷尽性检查
此外,自TypeScript 3.7以来,TypeScript具有以下特性:在编译器发现您处于代码的不可访问部分的任何情况下,例如在穷举开关语句之后,都不需要显式抛出或返回。有关更多信息,请参阅实现此功能的pull请求中的
因此,不仅不需要显式的穷尽性检查,这样的检查实际上会在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.
}
所以你一定要取消这张支票
如果您需要支持旧版本的TS,并且您的示例代码显示需要显式的穷尽性检查,那么您可能希望使用诸如return AssertNeverUnitTime之类的显式返回语句替换变量声明,其中assertNever仅接受never参数。这可能会让你的门楣感到高兴。但就目前而言,没有一个可复制的例子来说明这一问题,我认为我所提出的问题已经尽我所能得到了回答
为什么需要明确地这样做?即使没有never赋值,如果有人添加值,编译器也会抱怨-@thedude我记得必须对早期版本的TypeScript执行类似的操作。@thedude,在您的示例中总是有一个错误:函数缺少ending return语句,返回类型不包含“undefined”。@MaxHeiber correct,如果你不彻底检查所有的可能性,就会出现这个错误。如果你涵盖了所有的情况,错误就会消失。因此,如果有人在未添加代码的情况下向联合中添加了某些内容,则会出现错误reappear@MaxHeiber这是因为我添加了一个开关无法处理的值。如果我删除它,错误就会消失,为什么需要显式地这样做?即使没有never赋值,如果有人添加值,编译器也会抱怨-@thedude我记得必须对早期版本的TypeScript执行类似的操作。@thedude,在您的示例中总是有一个错误:函数缺少ending return语句,返回类型不包含“undefined”。@MaxHeiber correct,如果你不彻底检查所有的可能性,就会出现这个错误。如果你涵盖了所有的情况,错误就会消失。因此,如果有人在未添加代码的情况下向联合中添加了某些内容,则会出现错误reappear@MaxHeiber这是因为我添加了一个开关无法处理的值。如果我把它取下来,它就不存在了 错误消失了,我同意我应该删除_defactvenescheck行,但是错误消息变得更糟:函数缺少结束返回语句,返回类型不包含“undefined”。使用_defactvenescheck,TS准确地解释了缺少的内容。有没有办法得到一个好的错误消息?我同意我应该删除_defactvenescheck行,但是错误消息变得更糟:函数缺少结束返回语句,返回类型不包含“undefined”。使用_defactvenescheck,TS准确地解释了缺少的内容。有没有办法得到一个好的错误消息?