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
UIパーツの設計を「型」から読み解く 〜TSKaigiのセッションから得た学び〜
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
yud0uhu
June 25, 2026
Technology
570
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
UIパーツの設計を「型」から読み解く 〜TSKaigiのセッションから得た学び〜
TSKaigi 2026事後勉強会の登壇資料です。
https://smarthr.connpass.com/event/392342/
yud0uhu
June 25, 2026
More Decks by yud0uhu
See All by yud0uhu
美しいコードを書くためにF#を学んでみた話
yud0uhu
1
660
未必のマクベス
yud0uhu
0
56
Webブラウザ向け動画配信プレイヤーの 大規模リプレイスから得た知見と学び
yud0uhu
0
430
早朝の渋谷の青さ、あるいは溺れた人を助ける為に飛び込んだ海の向こう側に見る、自己覚知と自己開示の尊さ
yud0uhu
1
1.1k
動画配信サービスのフロントエンド実装に学ぶ設計原則
yud0uhu
1
410
非デザイナーのフロントエンドエンジニアがOOUIを考える
yud0uhu
9
6.1k
2023年の ゼロランタイムCSS in JS⚡️ を考える
yud0uhu
5
5.2k
Vue3/Electronで自作したマークダウンエディタをVue3/Tauriにリプレイスした話
yud0uhu
2
3.2k
入社半年を迎える新米エンジニアがカンファレンス・勉強会から得た学び
yud0uhu
0
1.1k
Other Decks in Technology
See All in Technology
企画を Software Factory-ready にする——開発が高速になったとき、PdMの仕事はどう変わったか
yachibit
1
250
AWSセキュリティで活用するAI機能
cmusudakeisuke
1
280
Temporal 最高!でも改めて「日付」について調べたら人類の負債すぎる件
riyaamemiya
0
230
Adversary Infrastructure Hunting101
disconinja
0
130
Claude Code on Bedrock で統制をかける小ネタ集/claude-code-bedrock-governance-tips
emiki
1
12k
S3 Filesで挑む! 八戸せんべい汁の食べ頃問題
usanchuu
0
170
ストレスなくAIと付き合いたい!こんなときどうしてる?
namiki64
4
680
シンプルな設定ファイルで実現する AWS IAM Identity Center の ユーザー管理Terraformフレームワークを公開しました / Simplifying AWS IAM Identity Center User Management: An Open-Source Terraform Framework
yamaguchitk333
0
260
Claude Codeから見る、エンジニアの世界の変容とその先
oikon48
3
1.3k
Obsidian Vault Architectures
x5gtrn
PRO
0
120
LLM Content Moderationを支える評価・改善ループの実践
suikabar
2
340
国際カードブランドルール変更に伴うクレジットカード決済取引仕様変更について
k1style
0
210
Featured
See All Featured
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
760
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
460
So, you think you're a good person
axbom
PRO
2
2.2k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
43k
WCS-LA-2024
lcolladotor
0
910
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
350
Abbi's Birthday
coloredviolet
4
10k
Practical Orchestrator
shlominoach
192
12k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
330
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
320
Transcript
UIパーツの設計を「型」から読み解く 〜TSKaigiのセッションから得た学び〜 0yu @yud0uhu 2026/06/25(Thu) TSKaigi 2026事後勉強会
自己紹介 0yu(おゆ) Web FE 好きなもの 推理小説、映画、謎解き・マダミス、ウイスキー @yud0uhu @yud0uhu
TSKaigiのセッションから得た学び
出典:React の props は値の集合ではない — UI の状態を宣言するコンポーネント設計(nabeliwo)さん
TSKaigiのセッションから得た学び UIパーツの設計を「型」から読み解く 同セッションの具体例として挙げられていた状態
出典:「進研ゼミでやったところだ!」現象|西川智希. note. https://note.com/nishikooooth/n/n9727b86bd772
様々な状態を持つUIパーツを propsで表現する
様々な状態を持つアイコンをpropsで表現する 課題 用途に応じて様々な状態を表現する「AnimationIcon」を再設計したい 「ToggleIcon」の名前で共通化された「AnimationIcon」が存在する お気に入り(オン/オフ) 再生/停止 ミュート/解除 10秒戻す、10秒進める
様々な状態を持つアイコンをpropsで表現する アイコンの責務と状態(振る舞い)の整理 すべてのアイコンに共通する振る舞い 「押下したこと」がアニメーションとしてフィードバックされる アイコンごとに異なる振る舞い トグルするアイコン(押下するとアイコンが変わる) 例:お気に入り(オン/オフ)、再生/停止、ミュート/解除 トグルしないアイコン(押下してもアイコンは変わらない) 例:10秒戻す、10秒進める
Before
Before Before 1 2 3 4 5 6 7 8
9 10 11 // 「トグルするアイコン」と // 「トグルしないアイコン」の責務が混在している type Props = { isShrinking: boolean; iconComponent: React.ReactNode; // トグルアイコンなのに、トグルしないアイコンが存在する previousIconComponent?: React.ReactNode; // アニメーションをさせるためだけに存在する handleShrinkComplete: () => void; handleGrowComplete: () => void; };
Before リファクタ前のコードの持つ問題点 「コード(型)が仕様を表現しきれていない」 実装者に誤った使い方を誘引してしまう
After
After 「discriminated union」でUIの振る舞いを型に閉じ込める 1 2 3 4 5 6 7
8 9 10 11 12 13 type ToggleProps = BaseProps & { type: "toggle"; isToggled: boolean; fromIcon: React.ReactNode; toIcon: React.ReactNode; }; type NonToggleProps = BaseProps & { type: "non-toggle"; icon: React.ReactNode; }; type Props = ToggleProps | NonToggleProps;
After Propsでアイコンごとの責務を分離する 1 2 3 4 5 6 7 8
9 export type BaseBouncyIconProps = { onClick: () => void; onAnimationEnd?: () => void; className?: string; }; export type PlayToPauseBouncyIconProps = BaseBouncyIconProps & { isPlaying: boolean; };
After JSXの構造でUIの状態を表現する 1 2 3 4 5 6 7 8
9 10 11 12 type ToggleProps = BaseProps & { // ... fromIcon: React.ReactNode; toIcon: React.ReactNode; }; return ( <BaseBouncyIconButton // ... fromIcon={<IconPlay className="size-full" />} toIcon={<IconPause className="size-full" />} />
「discriminated union」で UIの振る舞いを型に閉じ込める
「discriminated union」でUIの振る舞いを型に閉じ込める 「discriminated union」でUIの振る舞いを型に閉じ込める 1 2 3 4 5 6
7 8 9 10 11 12 // 不可能な状態を許容してしまう type BadProgressBarProps = { status: 'loading' | 'success' | 'error'; percent?: number; // loadingの時だけほしい message?: string; // errorの時だけほしい }; // 判別可能なユニオン型 type GoodProgressBarProps = | { status: 'loading'; percent: number; } | { status: 'error'; message: string; } | { status: 'success'; };
「シンプル」が至上
「シンプル」が至上 「シンプル」が至上 「いかに削ぎ落とすか、公開するものを減らすか」を考える ex.「判別可能なユニオン型」によるカプセル化でスコープを閉じる アニメーションする責務が外側から介在しなくなる
オブジェクト指向から考える 「カプセル化」と「命名」
オブジェクト指向から考える「カプセル化」と「命名」 オブジェクト指向から考える「カプセル化」と「命名」 “オブジェクト指向を超えて重要な原則は 「カプセル化」と「正しい名前付け」” ➖ オブジェクト指向と10年戦ってわかったこと | https://qiita.com/tutinoco/items/6952b01e5fc38914ec4e
オブジェクト指向から考える「カプセル化」と「命名」 オブジェクト指向から考える「カプセル化」と「命名」 「discriminated union」による「カプセル化」 単にPropsを共通化するのではなく、UIの振る舞い(ドメイン)を正し く型に落とし込む(モデリングする) 不可能な状態を型で許容しない 「正しい名前付け」による「関心の分離」 「アニメーションという振る舞い」と 「トグルする/しないというロジック」を分離して考える
ToggleIconはToggleIconではなかった
オブジェクト指向から考える「カプセル化」と「命名」 オブジェクト指向から考える「カプセル化」と「命名」 「discriminated union」による「カプセル化」 単にPropsを共通化するのではなく、UIの振る舞い(ドメイン)を正し く型に落とし込む(モデリングする) 不可能な状態を型で許容しない 「正しい名前付け」による「関心の分離」 「アニメーションという振る舞い」と 「トグルする/しないというロジック」を分離して考える
ToggleIconはToggleIconではなかった
まとめ
まとめ まとめ UIコンポーネントの設計では、Propsのデータ型そのもので仕様(UIの振 る舞い)を表現し、使う側の認知負荷を減らすのが理想 UIごとの責務の分離と、「引き算」を意識する 実業務で先輩から学んだ設計の話とセッションの内容が重なり、ユース ケース的な学びが大きかった💪