使用process.exit进行TypeScript推断

时间:2019-05-24 04:14:18

标签: typescript

通常,TypeScript可以在保护的帮助下推断变量的类型,然后返回:

type Pet = Dog | Cat;
function isDog(pet: Pet): pet is Dog {
  return true;
}

function fn1(pet: Pet) {
  if (isDog(pet)) {
    return;
  }

  // At this point, TS knows that `pet` is a `Cat`.
}

但是,如果我将返回值更改为process.exit,则此操作不再起作用:

function fn2(pet: Pet) {
  if (isDog(pet)) {
    process.exit(1);
  }

  // At this point, we know that `pet` should be a `Cat`, but TS doesn't know.
}

我是否有一种方法可以向编译器发出信号,表明该程序将在process.exit之后以与return类似的方式结束?

当然,我可以在process.exit之后添加一个收益。但是,在我的实际代码中,我的函数正在返回某些内容,将其称为MyObject,因此,当petDog时,没有合理的值,因此强制退出了。

我知道我可以做一些类型断言来解决这个问题,但是想知道什么是解决这个问题的好方法。

3 个答案:

答案 0 :(得分:1)

这是TypeScript的设计限制,无意对其进行修复。它不知道process.exit()导致进程退出,就像您使用总是抛出异常的函数一样,它也不知道。即使您的函数返回never

维护者的名言:

  

示例中的可达性取决于类型,但是该图是通过语法构建的。

作为更好的解决方法,您可以编写:

return process.exit(0);

类似的问题:https://github.com/microsoft/TypeScript/issues/8655

答案 1 :(得分:1)

我认为这是Typescript(甚至是最新版本)的局限性。

解决方法:

您可以return process.exit(1)

type Pet = Dog | Cat

function isDog(pet: Pet): pet is Dog {
    return true
}

function fn1(pet: Pet) {
    if (isDog(pet)) {
        return process.exit(1)
    }

    return console.log(pet)
}

Typescript推断petCat

screenshot of code

答案 2 :(得分:0)

2021 年偶然发现这个问题,目前的答案已经过时。

As of TypeScript 3.7,任何返回 never 的语句都会断言它下面的行将被标记为无法访问。 source

这就是在 DefinitelyTyped 中输入 process.exit 的方式。