TSでprocess.exit()
をラップしたカスタムexitを作った時に静的解析のフローが壊れたので、その対策。
因みにこの制御フローのことを Control Flow Analysis と呼ぶそうです。TS系の文書ではCFAと略されていることが多い。
目次
問題事例
静的解析例の7-8行目のように次の行から先がデッドコードになって欲しいのですが、上手くいきません。これを上手くいくようにします。
カスタム exit 例 | 静的解析例 |
---|---|
確認環境
Env | Ver |
---|---|
TypeScript | 4.8.4 |
サンプルコード
オブジェクトでラップして、カスタムexit関数の戻り値をnever
で指定してやると上手くいくようになります。
因みにこれTS の仕様らしく、上手くやる方法はあんまりなさそう。
実はアロー関数ではなくfunction
を使えば解決したりしますが、それはなんか嫌なので…
example.ts
type ErrorPayload = {
message: string;
code: number;
};
type ExampleExit = {
exit: (err: ErrorPayload) => never;
};
const exit = (err: ErrorPayload) => {
process.exit(err.code);
};
export const Example: ExampleExit = { exit };
implements.ts
import { Example } from './example';
Example.exit({ message: 'exit', code: 1 });
console.log(1);