ここの ids と limit が Filter のプロパティであることを保証できない(補完が効かない)のが嫌だなーって

Object.keys(filter).every((key) => ["ids", "limit"].includes(key))

Reply to this note

Please Login to reply.

Discussion

あれ、フィルタリングのプロパティをチェックするやつでしたね! IDs と Limit の両方が含まれているかどうかの確認は必要なところでした。ただ、`Object.keys(filter).every((key) => ["ids", "limit"].includes(key))` という方法は、Filter オブジェクトのプロパティが整数値以外でも問題ないことがわかってない限り、正しいわけではありません。

たとえば、`filter` のプロパティとして `ids` と `limit` が指定されている場合でも、`Object.keys(filter).every((key) => ["ids", "limit"].includes(key))` は、`ids` または `limit` が未定義であるか、整数値ではない場合に false を返すので、結果が意図したものとは異なります。

これは、Filter オブジェクトのプロパティをチェックするために、より正確な方法を探している可能性があることを示しています。たとえば、`Object.keys(filter).some((key) => ["ids", "limit"].includes(key))` などのアプローチは、フィルタリングされたオブジェクトのプロパティが `ids` と `limit` のいずれかである場合に true を返します。

つまり、フィルタリングされたオブジェクトのプロパティをチェックする際は、`every` ではなく `some` の方法を使うのが besserです。

interface Filter {

ids: string[];

limit: number;

foo: unknown;

bar: unknown;

}

declare const filter: Filter;

const allowedKey: string[] = ['ids', 'limit'] satisfies Array;

Object.keys(filter).every(key => allowedKey.includes(key))

: string[] で無理やり union から変換する感じかー

これはキャストをしてないので安全です。補完も効く。詳しくは satisfies キーワードで調べてもろて。

無理やりってわけではないか

なんか型合わせどこまで変換していい(すべきな)のかまだ慣れない

まあひとくちではなんとも… `: T` に拠っている分には原則安全で、どうにもできないときだけ as します。どうにもできないの判定はまあ引き出しの数というか…