Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
TypeScript の型とお作法
Search
Hayato Watanabe
May 12, 2024
Technology
240
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
200
(今更) AWS re:Invent 2023 報告
hayatow
0
180
Next.js で SPA を構築する際の辛み
hayatow
3
5.9k
[初心者] GitHub Actions と App Runner でコンテナデプロイやってみた
hayatow
0
970
Other Decks in Technology
See All in Technology
10Xに技術的負債をもたらした「2つの境界の歪み」その構造と解消への営み
10xinc
0
2.2k
2026-09-18 gotanda.sre Terraformで複数環境作ったり、複数Stateに分割したりそれとTerragrunt / Terraform multi envs and multi states
masasuzu
4
680
SREは、MCPとAutopilotをこう使え!
kazumax55
3
930
Slack上でインフラをトラブルシュートする! Agentic Platform Engineeringの第一歩
teru0x1
5
1.8k
山手線を徒歩で一周してわかった、 位置情報アプリは「足」が最強のデバッガー
hinakko
0
180
2026_devsumi_ozono.pdf
o3
3
550
Azure Serverless 2026:Production-ready な AI エージェント基盤 / Azure Serverless 2026: Production-Ready AI Agent Platform
miyake
2
460
JSONataとAWS Step Functionsで目指すRuntimelessな世界
mu7889yoon
0
370
AI時代、データエンジニアが一番おもろい
genshun9
0
680
AIに賢く動いてもらうためのコンテキスト〜Snowflake女子会 vol.8
snowwmn0824
0
130
越境するなら専門用語を使うな高校校歌 / If you wanna cross border, you shouldn't use jargon
vtryo
0
150
Von-Neumann Machines, Dreams & The Futures of IT
ufried
0
120
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
432
67k
エンジニアに許された特別な時間の終わり
watany
109
250k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
510
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
900
Build your cross-platform service in a week with App Engine
jlugia
234
19k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
Navigating Weather and Climate Data
rabernat
0
520
Product Roadmaps are Hard
iamctodd
55
13k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.6k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
Discover your Explorer Soul
emna__ayadi
2
1.3k
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!