Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我怎样才能获得接受TypeScript详尽性检查的工具,而不需要很多注释?_Typescript_Istanbul_Typescript Eslint - Fatal编程技术网

我怎样才能获得接受TypeScript详尽性检查的工具,而不需要很多注释?

我怎样才能获得接受TypeScript详尽性检查的工具,而不需要很多注释?,typescript,istanbul,typescript-eslint,Typescript,Istanbul,Typescript Eslint,我写了很多使用穷尽性检查的代码 在下面的代码中,如果有人添加到UnitOfTime联合中,则带有_defactVenesCheck的行将故意出现类型错误。我喜欢这种编程风格,但如果再加上代码覆盖率和强大的过梁,这将成为一种痛苦: function waterFrequencyToMilliseconds(unitOfTime: UnitOfTime): number { switch (unitOfTime) { case 'days': return number *

我写了很多使用穷尽性检查的代码

在下面的代码中,如果有人添加到UnitOfTime联合中,则带有_defactVenesCheck的行将故意出现类型错误。我喜欢这种编程风格,但如果再加上代码覆盖率和强大的过梁,这将成为一种痛苦:

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准确地解释了缺少的内容。有没有办法得到一个好的错误消息?