blog.bouzuya.net

2019-12-11 @types/power-assert 1.5.2 で CI が fail した

@types/power-assert の 1.5.2 で CI が fail した 。問題の箇所は↓。

declare function assert(value: any, message?: string): asserts value;

このように asserts を使っている。 assert() の意図からすると良さそうなのだけど。ぼくの repository への dependabot からの Pull Request で CI が fail した。

たとえば↓の形でコンパイルエラーになる。

const o = { x: 123 };
const f = () => o.x = 456;
assert(o.x === 123);
f();
assert(o.x === 456);

f() のあと o.x は変更される可能性があるのだけど asserts で考慮されていないようだ。 TypeScript 側の問題のような気がする。

Kotlin にも似たような型の絞り込みの機能があるのだけど。↑のようなプロパティアクセスだと毎回値が変わるものとして絞り込まれない挙動になる。どうしても絞り込みたいなら↓のような形にする。

// o.x は null になりえる property とする
val x = o.x
if (x != null) {
  // x は null ではない
  // o.x はここで取得するタイミングで null になりえる
}

このあたりの考慮が実は漏れているのでは…… (そんなバカな……) 。 TypeScript の細かい挙動には詳しくないのでよく分からない。