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 の細かい挙動には詳しくないのでよく分からない。
TypeScript の問題な気がするけど、 `@types/power-assert` の 1.5.2 。 `declare function assert(value: any, message?: string): asserts value;` asserts を使っているので、 `assert(o.x === 1); /* x を裏で変更する操作 */ assert(o.x === 2);` がコンパイルエラーになる。
— bouzuya (@bouzuya) December 11, 2019