---
# System prepended metadata

title: "【第41週】ブルーベリー本輪読会\U0001FAD0\U0001FAD0<br />(2023-07-15)"
tags: [ブルーベリー本]

---

# 【第41週】ブルーベリー本輪読会🫐🫐<br />(2023-07-15)

[![hackmd-github-sync-badge](https://hackmd.io/Wh3vhluYQEi2UE-OqEpbow/badge)](https://hackmd.io/Wh3vhluYQEi2UE-OqEpbow)


###### tags: `ブルーベリー本`

- [開催概要](https://hackmd.io/1kCgi6_tSGukG0KZrqDLvA)
- [ブルーベリー本輪読会ノートまとめ](https://hackmd.io/Ih6bdReuR3eQpYkGaCx8pg)
- [プロを目指す人のためのTypeScript入門-サポートページ](https://gihyo.jp/book/2022/978-4-297-12747-3/support)（正誤表・サンプルコードのダウンロードページ）

---
## 2023-07-15（土）

### タイムスケジュール
- 雑談(5min) ~9:05
- 輪読(40min) ~9:45
- 前半の記入(5min) ~9:50
- 休憩(10min) ~10:00
- 輪読(45min) 前半での疑問の解消含む ~10:45
- まとめ(15min) ~ 11:00

### 進行係

- @haruguchi

### ドライバー

- @みんな

### 読んだところ

- p.244 「5.6.3 力試し」 から

### 次回

- p.340 「7.4 力試し」 から

### 自由に使う共有スペース

### わからなかったこと・疑問など

### 各自の疑問点や気づき、学んだこと

- @haruguchi
    - タグ付きユニオンはオブジェクトの絞り込みに便利そう。
    - オブジェクトの絞り込みは持ってるプロパティによって難易度が変わってきそうで、tag(任意)プロパティを持つことで容易に識別できるようになる。
    - あとは型情報をもとに条件分岐できる TSの世界の情報をJSまで持ってくるイメージ

- まっきー
    - クラスを関数に書き換える→ユーザーの数だけ`getMessage`関数がつくられるイメージ、らしい
    - タグ付きユニオン型は使える場面がまだ浮かばないけど、とりあえずこういうのがあることは覚えておく
    - `obj is Some`みたいなisを使った書き方があるのは知らなかったので頭が混乱した・・
    - <T,U>を使った書き方は前回に続き学べたので読めるようにはなった気がする

- cafedomancer
    - クラスとは違って、実行時のデータ型を持たないオブジェクトのようなデータでも、タグ付き？のなにかを使うと、実行時にもデータを使えて便利だった
    - ユーザー定義型ガードがなにか分かった

- LEF
    - `map`メソッドはメソッドの意味的に引数と返り値の型を決定できないので、`<>`の中に２つ要るのかな～と思いました。


- @Maeda8 
  - タグ付きユニオンは実行時にも型の識別ができるのが便利という点が知見だった
```typescript=
// instanceofでは型で絞り込めない
function myMap<T, U>(obj: Some<T> | None, f: (obj: T) => U): Some<U> | None {
    if (obj instanceof Some){...}
}
```
  - ユーザー定義型ガードは明らかに人間の目の方が優っている時に使用する。くらいに思っていたら良さそう
```typescript=
// このisSome関数だと、12行目のvalueにアクセスするときにコンパイルエラーが出てしまう
function isSome<T>(obj: Option<T>) {
    return obj.tag === "some"
}

// コンパイラに戻り値のobjはSome<T>だと教えてあげる必要がある
function isSome<T>(obj: Option<T>): obj is Some<T> {
    return obj.tag === "some"
}

function showNumberIfExist(obj: Option<number>) {
    if (isSome(obj)) {
        console.log(obj.value)
    }
}
```
  - <T, U>は苦手
  	- 未確定なものが何個あるかというところで決まると考えるのが良さそうと教えてもらった
    - まずは `Map` (連想配列) のような、明らかにデータ型が 2 つ必要なケースで慣れていったらいいんじゃないですかね。 `Array.map()` だと、変換前と変換後でデータ型が変わらないケースも多いので、よく分からなくなりそう。

### 本日の振り返り(よかった点・次回に向けての改善点等)

- @haruguchi
    - まっきーさんの分報にあったfor文のやつ見てこの輪読会で昔、梅本さんと前田さんとfor文のスコープに関するクイズ解いたなぁという記憶が蘇ってきた。
    https://discord.com/channels/715806612824260640/1063364378784714772/1129561359017840830
        - JSPrimerにはvarとletのスコープのちがいは書いてなかったので、中級な内容でしょうか・・？？
            - `var` はもう使わないので知らなくていい、ということかも...
        - あれ、varとletのスコープの違いは書いてあったはず！　for文のスコープの話は書いてない
            - 🙏
- LEF
    - MisskeyのバックエンドがTypeScript＆NestJS（node.js）で、読みに行ったんですけど全然読めませんでした……
    - 皆さんもnode-sqlite3のβテスト、やりましょう！ → [非同期処理 (JavaScript) の新しい課題のプレミア公開 | FBC](https://bootcamp.fjord.jp/events/120)

- cafedomancer
    - 最近 TypeScript の勉強をサボっていて良くない

- まっきー
    - そろそろ仕事でもTypeScriptを読まないといけないので、ブルーベリー本読まないと・・・