no-unsafe-assignmentはany型の代入を禁止するルール
TypeScriptは型の安全性をコンパイルレベルで担保してくれる言語ですが、型の制限をユーザーが調整できるように、一応言語的にany型(何でもあり)が使えるようになっています。その為、型の制限を厳格にするためにESLintのno-unsafe-assignmentというany型の代入を禁止するルールを導入している所は多いのではないでしょうか?
公式のリファレンス通りに使うとエラーが出る
expect.any()もexpect.anything()も、どちらも値の比較をする際に中の値はともかくnull・undefinedではないことを確認するときに使います。オブジェクト型同士の比較では、重要ではないパラメータに設定することで、そこに何が入っていても検証を通過するようになりとても便利です。
オブジェクト型の一致判定
const can1 = {
flavor: "grapefruit",
ounces: 0.1 + 0.2,
};
const can2 = {
flavor: "grapefruit",
ounces: expect.any(Number),
};
test("オブジェクト同士の比較", () => {
expect(can1).toEqual(can2);
});
しかしここでno-unsafe-assignmentが使われていると、expect.any()とexpect.anything()は共にany型を返すメソッドになっている為コンパイルエラーになります。any型を変数に入れるなと警告されるわけです。
コンパイルエラーが発生する
const can1 = {
flavor: "grapefruit",
ounces: 0.1 + 0.2,
};
const can2 = {
flavor: "grapefruit",
ounces: expect.any(Number), // no-unsafe-assignment error
};
test("オブジェクト同士の比較", () => {
expect(can1).toEqual(can2);
});
解決法
その為、 no-unsafe-assignmentが有効なときは型アサーションを行う必要があります。
no-unsafe-assignmentがあるときのexpect.any()とexpect.anything()
const can2 = {
flavor: "grapefruit",
ounces: expect.any(Number) as Number, // OK
または
ounces: expect.anything() as Number, // OK
};
実際のコードで試してみて正常に動くことは確認済です。(公式のリファレンスにも書いておいてほしいな…)
下線部の書き方は、どちらも同じ効果になるのでどちらか一つの書き方に絞って記述しましょう。
まとめ
個人的な意見ですが、私はexpect.any()だと無駄な処理が内部で走ってしまい、見た目上も二回型アサーションしているように見えて冗長になので、expect.anything()を使っています。