Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
TypeScript の型とお作法
Search
Hayato Watanabe
May 12, 2024
Technology
230
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
TypeScript の型とお作法
https://digdig.connpass.com/event/315640/
で発表した資料です
Hayato Watanabe
May 12, 2024
More Decks by Hayato Watanabe
See All by Hayato Watanabe
2025年版 サーバーレス Web アプリケーションの作り方
hayatow
24
28k
CDKTF ではじめるマルチクラウド IaC
hayatow
0
190
(今更) AWS re:Invent 2023 報告
hayatow
0
170
Next.js で SPA を構築する際の辛み
hayatow
3
5.8k
[初心者] GitHub Actions と App Runner でコンテナデプロイやってみた
hayatow
0
950
Other Decks in Technology
See All in Technology
Claude Codeとハーネスについて考えてみる
oikon48
18
9.3k
kintone の AI コワーカーを、 Anthropic にエージェントを"ホストさせて"作った話 #devkinmeetup
sugimomoto
0
100
AIレビューはどこまで任せられるのか?自動化と人が背負うレビューの境界
sansantech
PRO
2
720
証券システムを10年Scalaで作り続けるということ - 関数型まつり2026
krrrr38
3
840
あなたの『Site』はどこですか? — xREという考え方
miyamu
0
1.2k
完全自律ロボットを作りたくて、先に開発を自律させた話(ROS Japan UG #63 LT)
rryz09
0
490
SRE Next 2026 何でも屋からの脱却
bto
0
620
Mastraエージェント、どのクラウドにデプロイする?
minorun365
PRO
2
180
AI駆動開発におけるQAエンジニアの役割事例 〜AI駆動開発の現場から〜
kobayashiyorimitsu
0
490
【Claude Code】鹿野さんに聞く 私の推しの並行開発環境 大公開 / claude-code-parallel-2026-07-15
tonkotsuboy_com
10
6.8k
KiCAD講習会②
tutcreators
0
110
Foxgloveについて 実際にExtensionを開発して公開するまでの話 / About Foxglove: The Story of Developing and Releasing an Extension
ry0_ka
0
210
Featured
See All Featured
Facilitating Awesome Meetings
lara
57
7k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.7k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
340
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
Automating Front-end Workflow
addyosmani
1370
210k
Abbi's Birthday
coloredviolet
3
8.6k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
340
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
310
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
Optimizing for Happiness
mojombo
378
71k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
290
Transcript
TypeScript の型とお作法 手強いコードベースと向き合ってきた 僕のお気持ち 2024 春 2024/05/11 札幌ITでぃぐでぃぐ会 vol.1 ~TypeScript
勉強会~ 渡辺隼人
自己紹介 • 渡辺隼人 • 株式会社サーバーワークス • 札幌在住 (2023/7 ~) •
any 撲滅委員会として活動中 • X: @nabecmdctrl
はじめに • TypeScript はスーパーセットということを覚えておこう • コンパイラはだませる • 過去 1 年間で
350 件ほど PR レビューを実施した者の話です • コードは必ずしもコピペで問題なく動くもモノではないです • 今日の話は僕の考える最強の~系なので参考程度にどうぞ • まさかり待ってます
本日のお品書き • object を typeof 演算子で評価するのは 気を付けて • Array.filter に気を付ける
• 型ガード • Input の型 • any 撲滅委員会 • 純関数委員会 • 配列を index で操作するのは避けたい • Truthy, Falsy の評価に気を付けよう • Union 混ぜるな危険 • eslint-disable はライン指定 • Array.map forEach を使い分ける • as unknown as で上書き • 配列は空配列で初期化するとよい • 不要なオプショナルアクセス演算子を 削除したい • NaN で? • Utility Type を使おう • null と undefined を同時に check • 型宣言 • Wrapper Library で型が提供されていない 場合もあきらめない
object を typeof 演算子で評価するのは気を付けて • 配列や null も object Why
• typeof - JavaScript | MDN 私のお気持ち • どちらかを使いましょう • type predicates • Zod
Array.filter に気を付ける • 型推論されません Why • コンパイラおバカ • Infer type
predicates from function bodies using control flow analysis お気持ち • TypeScript はスーパーセット だね
型ガード • 型を判別しましょう Why • 型を確定させないと意図し ているプロパティにアクセ スできない お気持ち •
in 演算子とかでむりくり型 推論するのやめてくれ
any 撲滅委員会 • any は型という概念を消す Why • 型がみえないよ~ • TypeScript
使っている意味を 考えたい お気持ち • no-explicit-any • unknown を使う
純関数委員会 • プリミティブ以外は参照渡 しになっちゃう Why • プログラムの原則でもある • 副作用は避けたい お気持ち
• no-param-reassign
配列を index で操作するのは避けたい • index 操作だと配列の範囲を 考慮した型推論がされない Why • なんで?
お気持ち • オブジェクトに • したらいいよね
Truthy, Falsy の評価に気を付けよう • Truthly, Falsy な値を評価をす ると。。 Why •
言語的にそうなんすね。 きっと お気持ち • strict-boolean-expressions
Union 混ぜるな危険 • Union で型定義すると何が何 だかわからない Why • どっちの型かわからないの。 お気持ち
• Generics 使おう
eslint-disable はライン指定 • // eslint-disable-next-line をつかおう! Why • ファイル指定にすると他の lint
警告・エラーを見落とし ます。 お気持ち • 同上
Array.map forEach を使い分ける • Array.map: 元の配列を変換し、 変換後の新しい配列を返す • Array.forEach: 各要素に対し
て順番に関数を実行し、そ の関数による副作用をもた らす。 Why • 言語が提供している機能の 目的に沿って記述したい お気持ち • 可読性を意識すると選択す べきメソッドがわかるはず
as unknown as で上書き • どうしても型があわないと きで動作が担保できるケー スはあり! Why •
コンパイラはだませる! お気持ち • ランタイムと合わせるなら ありだと思う
配列は空配列で初期化するとよい • nullish を排除する Why • Iteration protocols に準拠し たものとして扱える
お気持ち • 型チェック挟むより良い場 合がある
不要なオプショナルアクセス演算子を削除したい • 運用が進んでいくとゴミが 残る可能性があります Why • 精神衛生の向上 お気持ち • no-unnecessary-condition
NaN で? • NaN は number 型 • しっかりチェックしないと いけない
• あと NaN マイルで undefined 会員は避けたい Why • 言語設計かな? • なんでだろう お気持ち • NaN が number でこういう時 いいよねってあれば教えて ください
Utility Type を使おう • Utility Type を使うと既存の 型からいろいろできます。 お気持ち •
(広義の) 定義が存在するの であれば独自定義をする必 要はない
null と undefined を同時に check • 等価演算子でいいよ Why • TypeScript
Deep Dive で言っ てるから お気持ち • それ以外は厳密等価演算子 を使いましょう
型宣言 • 推論できるなら推論したい Why • 根幹の型が変わった場合、 コードの修正点が増える お気持ち • ある程度の精度がでている
推論型のケースは型を明示 させない lint 教えて
Wrapper Library で型が提供されていない場合もあ きらめない • ときどきあります • 例: vue.draggable は
SortableJS の Wrapper です。 MoveEvent 型とかが SortableJS のほうにしかない (ような気がする) Why • そういうときもある お気持ち • ライブラリを使ってるのに 型定義自分でするのはおか しいでしょという気持ち
HTML Input number の value の型 • string なんすわ。。 •
undefined もあるぞ。。 Why • なんで?わかんない • <input type="number"> - HTML: HyperText Markup Language | MDN お気持ち • どうすればいいんですか? • とりあえず型全部みます
Thank you!