TypeScript-inferering med process.exit
Vanligvis kan TypeScript utlede typen til en variabel ved hjelp av en sjekk etterfulgt av en retur:
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`.
}
Men hvis jeg skulle endre return til process.exit, fungerer dette ikke lenger:
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.
}
Finnes det en måte for meg å signalisere til kompilatoren at programmet ville ha avsluttet etter process.exit, på en lignende måte som return?
Selvfølgelig kunne jeg bare legge til en return etter process.exit. Men i min faktiske kode returnerer funksjonen min noe, la oss kalle det MyObject, slik at det ikke finnes noen rimelig verdi for når pet er en Dog, derav den tvungne avslutningen.
Jeg er klar over at jeg kunne gjort noen typepåstander for å komme rundt dette, men lurer på hva som er en god måte å løse dette på.
Svar #1
Jeg tror det er en begrensning i Typescript (selv den nyeste versjonen).
Løsning:
Du kan 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 antar at pet er en Cat.
Svar #2
Det er en designbegrensning i TypeScript, og det er ingen plan om å fikse det. Det ville ikke vite at process.exit() får prosessen til å avslutte, på samme måte som hvis du bruker en funksjon som alltid kaster en unntak, ville det heller ikke vite det. Selv om funksjonen din returnerer never.
Sitat fra vedlikeholdere:
Beregnbarhet i eksempelet ditt bestemmes av type, men grafen er bygget syntaktisk.
Som en hyggeligere løsning kunne du skrevet:
return process.exit(0);
Lignende problem: https://github.com/microsoft/TypeScript/issues/8655
