👷
zod.coerce.numberの挙動について調査してみた
zod.coerceで何が行われているのかわからず怖かったので動作確認してみた。
コード
const n = z.coerce.number()
const result = n.safeParse(v) // vにいろいろ入れて動作確認
console.log({
v,
success: result.success,
data: result.success ? result.data : '',
})
結果
| v | success | data |
|---|---|---|
| undefined | false | |
| null | true | 0 |
| true | true | 1 |
| false | true | 0 |
| NaN | false | |
| Infinity | true | Infinity |
| -Infinity | true | -Infinity |
| 0xfa | true | 250 |
| 1 | true | 1 |
| '' | true | 0 |
| 'true' | false | |
| 'false' | false | |
| 'Infinity' | true | Infinity |
| '-Infinity' | true | -Infinity |
| '0xfa' | true | 250 |
| '-1' | true | -1 |
| '0' | true | 0 |
| '1' | true | 1 |
| '1.1' | true | 1.1 |
| '1' | false | |
| {} | false | |
| [] | true | 0 |
| [true] | false | |
| [false] | false | |
| [1] | true | 1 |
| ['1'] | true | 1 |
| ['1', '2'] | false |
まとめ
怖い
Discussion
要は
isNaN(Number(v))以上のことはやってないっぽい