async内の型ガードがawait 後も維持される問題
問題: TypeScript側で絞り込んまれた結果が、await 後、維持されるべきでない場合も維持されてしまう。
例: ここでは console.log(moduleVar.foo.length)
においてmoduleVar.fooが"bar"
(string) だというTypeScript側の絞り込み結果が維持されてしまっていることから、コンパイルが通ってしまう。
module.ts
const moduleVar: {foo: string | undefined} = {
foo: "bar",
};
async function main() {
if (moduleVar.foo !== "bar") throw "";
await otherProcess();
console.log(moduleVar.foo.length);
}
async function otherProcess() {
moduleVar.foo = undefined;
}
main();
※ 上例でいう moduleVar
がクラスのインスタンスであっても同様
対策: 上例に即せば moduleVar
のfoo
の値をfunctionコールで取得するようにする
anyな値が非any型変数に代入できる問題
例: hoge
の値はanyとして扱われる
const hoge = JSON.parse(`{aa:3}`);
const str: string = hoge;
console.log(str);
対策: anyな値が登場したら必ず絞り込むようにする