UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Zod】オブジェクトのKeyをある型の変数として扱いたい

Zodで オブジェクトのKeyをある型の変数として扱いたい

結論、その場合はz.recordを使う
zod.dev

キーの型を気にせずオブジェクトの値だけを検証するだけなら以下で良い

const NumberCache = z.record(z.number());
type NumberCache = z.infer<typeof NumberCache>;

キーと値の両方を検証したい場合は、 z.record(keyType, valueType)を使用する

const NoEmptyKeysSchema = z.record(z.string().min(1), z.number());
NoEmptyKeysSchema.parse({ count: 1 }); // => { 'count': 1 }
NoEmptyKeysSchema.parse({ "": 1 }); // fails

注意点

JavaScript は内部ですべてのオブジェクト キーを文字列に自動的にキャストするので、キーを数字にした時に文字列になっていることに注意する

const testMap: { [k: number]: string } = {
  1: "one",
};

for (const key in testMap) {
  console.log(`${key}: ${typeof key}`);
}
// prints: `1: string`