Open3

JSON.parse(JSON.stringify(x))をオブジェクトのコピーに使ってない??危ないよ

あいや - aiya000あいや - aiya000

実務で、オブジェクトのディープコピーにJSON.parse(JSON.stringify(x))を使っていたのを、Property Based Testingして気づいた。
これをTypeScriptで使うと、完全に型安全性を破壊する…。

const clone = <T>(source: T): T => JSON.parse(JSON.stringify(source))

const x: undefined = clone([undefined])[0]
console.log(x) // null
// undefined型の変数にnullが入っている

まあimplicit any使ってるしね、何が起きてもおかしくない。

NaNやInfinityでも同じことが起こる。
↓を参照してください。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

あいや - aiya000あいや - aiya000

オブジェクトでも、これらの型の値は正常にコピーされません

> JSON.parse(JSON.stringify({ a: undefined }))
{}
> JSON.parse(JSON.stringify({ a: Symbol('a') }))
{}
> JSON.parse(JSON.stringify({ a: () => {} }))
{}
> JSON.parse(JSON.stringify({ a: NaN }))
{ a: null }
> JSON.parse(JSON.stringify({ a: Infinity }))
{ a: null }
  • 全て'解説'に書いてありました。たすかる