通常,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
,因此,当pet
是Dog
时,没有合理的值,因此强制退出了。>
我知道我可以做一些类型断言来解决这个问题,但是想知道什么是解决这个问题的好方法。
答案 0 :(得分:1)
这是TypeScript的设计限制,无意对其进行修复。它不知道process.exit()
导致进程退出,就像您使用总是抛出异常的函数一样,它也不知道。即使您的函数返回never
。
维护者的名言:
示例中的可达性取决于类型,但是该图是通过语法构建的。
作为更好的解决方法,您可以编写:
return process.exit(0);
答案 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推断pet
是Cat
。
答案 2 :(得分:0)
2021 年偶然发现这个问题,目前的答案已经过时。
As of TypeScript 3.7,任何返回 never
的语句都会断言它下面的行将被标记为无法访问。
source
这就是在 DefinitelyTyped 中输入 process.exit
的方式。