2018-10-08 Simple.JSON における Maybe と Nullable の違いを確認した / 『秋期限定栗きんとん事件(上)』を読んだ
bouzuya/purescript-openapi-specification 。どういう動きの何をつくるのかあまり考えてないけど、とりあえずリポジトリをつくった。
今日の学び。 justinwoo/purescript-simple-json の Maybe
と Nullable
の違い。 README にある注意書きそのままなのだけど、実際に自分でためして確認した。
module Test.Main
( main
) where
import Data.Either (Either(..), isLeft)
import Data.Maybe (Maybe(..))
import Data.Nullable (Nullable, toNullable)
import Effect (Effect)
import Foreign (MultipleErrors)
import Prelude (Unit, discard)
import Simple.JSON (readJSON, writeJSON)
import Test.Unit (suite, test)
import Test.Unit.Assert as Assert
import Test.Unit.Main (runTest)
type MaybeJson = { a :: Maybe String }
type NullableJson = { a :: Nullable String }
main :: Effect Unit
main = runTest do
suite "Simple.JSON" do
test "readJSON (Maybe a)" do
let f s = readJSON s :: Either MultipleErrors MaybeJson
Assert.equal (Right { a: Just "b" }) (f """{"a":"b"}""")
Assert.equal (Right { a: Nothing }) (f """{"a":null}""")
Assert.equal (Right { a: Nothing }) (f """{}""")
test "readJSON (Nullable a)" do
let f s = readJSON s :: Either MultipleErrors NullableJson
Assert.equal (Right { a: toNullable (Just "b") }) (f """{"a":"b"}""")
Assert.equal (Right { a: toNullable Nothing }) (f """{"a":null}""")
Assert.equal true (isLeft (f """{}"""))
test "writeJSON (Maybe a)" do
Assert.equal """{"a":"b"}""" (writeJSON ({ a: Just "b" } :: MaybeJson))
Assert.equal """{}""" (writeJSON ({ a: Nothing } :: MaybeJson))
test "writeJSON (Nullable a)" do
Assert.equal """{"a":"b"}""" (writeJSON ({ a: toNullable (Just "b") } :: NullableJson))
Assert.equal """{"a":null}""" (writeJSON ({ a: toNullable Nothing } :: NullableJson))
Nullable String
だと、 Nullable
の名前どおり TypeScript で言うと a: string | null
っぽく動く。読み込みに undefined
(キーが存在しない状態) を許容せず Left
にするし、書き込みは "a": null
になる。
注意すべきは Maybe
。
Maybe String
だと、 TypeScript で言うと a?: string | null
っぽく動く。書き込み時に Nothing
だと JSON の a
はキーが存在しない状態になる。読み込み時は JSON のキーが存在しない状態か null
だと Nothing
になる。ぼくの感覚では読み込み時の null
の許容はおまけで、基本的には Maybe String
は a?: string
だと思って良さそう。
まとめ。
Simple.JSON
でのk :: Nullable a
→ TypeScript のk: a | null
のイメージSimple.JSON
でのk :: Maybe a
→ TypeScript のk?: a
のイメージ ("k": null
もNothing
として解釈してくれるおまけつき)
bouzuya/shiba を 0.3.0 に。期間の判定を変えてみた。様子見。
『秋期限定栗きんとん事件(上)』を読んだ。夏期限定よりもじっくり来る感じ。ふたりの関係もあって、間に噛む人数が増えているので、ね。いや、ひょっとすると上下巻の尺なだけかもしれないけど……。続きが気になる。
ベビーカーでおでかけ。動きが止まると泣き出す。難しいやつだ。