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
940
Other Decks in Technology
See All in Technology
[モダンアプリ勉強会]今更聞けないGit/GitHub入門
tsukuboshi
0
300
BigQuery の Cross-cloud Lakehouse への歩み
phaya72
2
600
Claude Code×Terraform IaC テンプレート駆動開発
itouhi
1
440
美味しいスイスチーズを作ろう🧀🐭
taigamikami
1
260
Terraformモジュールは、なぜ「魔境」化するのか
hayama17
2
220
【Gen-AX】20260530開催_JJUG CCC 2026 Spring
genax
0
440
Agentic Defenseとともにセキュリティエンジニアが輝き続けるには / How Security Engineers Can Keep Excelling with Agentic Defense
yuj1osm
0
130
LLMにもCAP定理があるという話
harukasakihara
0
170
Microsoft Build Keynoteふりかえり
tomokusaba
0
110
10倍の生産性を実現するAI駆動並列エージェントのすべて
kumaiu
4
990
ポケモンの型をTypeScriptの型システムで表現してみた
subroh0508
0
350
AI Adaptable なテストを整える工夫 / Ways to Make Your Tests AI-Adaptable
bitkey
PRO
3
220
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
160
The Cost Of JavaScript in 2023
addyosmani
55
10k
エンジニアに許された特別な時間の終わり
watany
107
250k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
850
Statistics for Hackers
jakevdp
799
230k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
200
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
340
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
400
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
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!