ブックマーク / zenn.dev/mshaka (3)

  • 続・TypeScriptの`never`と`unknown`

    はじめに 先日公開した記事では、部分型関係を導きの糸としてkeyof neverとkeyof unknownの定義を説明しました。存外に多くの方に読まれ著者としては嬉しい限りです。味をしめた今回は、前回の記事でやり残した感のあるneverとunknownそのものの振る舞いについて補足を加えたいと思います。 具体的には、neverとunknownの部分型関係における特殊な立ち位置について、図解を交えた解説を試みます。neverは全ての型の部分型であり、unknownは全ての型の上位型です。この性質を理解すると、|と&にneverやunknownをわせたときの挙動も理解しやすくなります。また、distributive conditional typeにおけるneverの振る舞いも統一的な解釈が与えられることになります[1]。 なお、前回の記事は読まれていることを前提とさせていただきます。 n

    続・TypeScriptの`never`と`unknown`
    yug1224
    yug1224 2024/10/02
  • 部分型関係から考えるTypeScriptの`keyof`と`never`と`unknown`

    型Tは"a"と"b"というキーを持つ型なので、keyof Tは"a" | "b"型になるというわけです。 では、keyof neverやkeyof unknownはどうなるでしょうか? 後に見るように、どんな型TをとってきてもneverはTの部分型であることと、Tはunknownの部分型であることがneverとunknownのそれぞれの特徴です。しかし、具体的にはどんな型なのでしょうか?そうした型のキーとは?ちょっと想像しにくいのではないでしょうか。 以下では、keyof neverとkeyof unknownのいい感じの定義を決めるための考え方を紹介していきます。例えば、指数関数を例としてみましょう。正の実数aに対してa^0 = 1と定めておくと、どんな実数r, sに対してもa^{r+s} = a^r \cdot a^sが成り立つ(いわゆる指数法則)ので嬉しいです。keyof never

    部分型関係から考えるTypeScriptの`keyof`と`never`と`unknown`
    yug1224
    yug1224 2024/09/25
  • JSON.parse(JSON.stringify(x))に型をつけよう

    はじめに WebバックエンドとクライアントをともにTypeScriptで書くとします。また、バックエンドではJSON.stringifyで値をシリアライズし、クライアントサイドではJSON.parse相当の処理でレスポンスボディを取得すると仮定しましょう[1]。このとき、JSON.stringifyの挙動がわかれば、実際にクライアントにどのような値が返ってきうるかを型で表現できるはずです。例えば、 となるので、{ a: undefined }の型をJSON.stringifyしてからJSON.parseした値の型は{}とするべきです。 稿では、JSON.stringifyの仕様に沿ってそのような型を定義する方法について解説していきます。また、その際の制限についても最後に軽く触れます。 背景 稿の概要を理解をするためには不要ですが、この節ではそれを試みることになった背景についてお話ししま

    JSON.parse(JSON.stringify(x))に型をつけよう
    yug1224
    yug1224 2024/07/07
  • 1