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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
GitHub Copilot運用のリアル ~AI Credit時代にどう向き合うか~
takafumisu2uk1
0
580
從觀望到全公司落地:AI Agentic Coding 導入實戰 — 流程整合與安全治理
appleboy
0
320
フルAIで個人開発して学んだあれこれ / yuruai vol.1
isaoshimizu
0
160
AWS PrivateLink × SCIM で実現する セキュアで運⽤負荷の低い Databricks 基盤の構築
tsuda7
0
120
AI Agentをシステムに組み込む前にゆるく向き合ってみる
hayama17
0
180
勉強会企画をアプリで構造化してみた 〜そこで見えた、AIとの付き合い方〜 / I've structured a study group plan using an app.
pauli
0
220
WebGIS AI Agentの紹介
_shimizu
0
600
Kotlin 開発のツラミを爆破した話! / Explode the difficulty of Kotlin dev!
eller86
0
130
グローバルチームと挑むプロダクト開発
sansantech
PRO
1
110
作る力から、見極める力へ — AI時代に広がるエンジニアの価値と役割
rince
0
390
攻撃者がいなくてもAIエージェントはインシデントを起こす
nomizone
0
170
5分でわかる Amazon Connect_20260608
hwangbyeonghun
0
150
Featured
See All Featured
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
Design in an AI World
tapps
1
250
Mind Mapping
helmedeiros
PRO
1
270
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
The Spectacular Lies of Maps
axbom
PRO
1
840
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
From π to Pie charts
rasagy
0
220
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
860
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
280
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
610
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!