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
960
Other Decks in Technology
See All in Technology
Pavlokで始める電撃駆動開発
sgrsn
0
170
AIがコードを書く時代、人間は何を保証するのか———馬場さんと考える、開発者に求められる新しい責任と価値 - TECH PLAY
netmarkjp
0
1.3k
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
4.9k
SnowflakeCoCoでデータエンジニアリング!
foursue
0
170
制約理論(ToC)入門 2026版
recruitengineers
PRO
2
290
AIエージェントの知識表現と推論に なぜグラフが使われるのか - 記号的AIの復権とニューラルAIとの統合
yohei1126
1
280
Amazon Bedrock Managed Knowledge BaseDive Deep
ren8k
0
400
Flutterをカメラで動かしたかった話
sony
0
120
Breaking the Seal: Static Deobfuscation of Compiled V8 JavaScript Bytecode Malware
hshrzd
0
430
第3回しろおびセキュリティスポンサーセッション
log0417
0
140
組織にどうSREを根付かせるか?〜IVRyの場合〜
abnoumaru
0
320
サイバー捜査員研修(後半)
nomizone
1
590
Featured
See All Featured
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.5k
Mobile First: as difficult as doing things right
swwweet
225
10k
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
The Cost Of JavaScript in 2023
addyosmani
55
10k
Product Roadmaps are Hard
iamctodd
55
12k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
440
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
We Are The Robots
honzajavorek
0
290
The Curse of the Amulet
leimatthew05
2
13k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
190
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!