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のextends
Search
MisakiSoeda
April 23, 2025
Programming
0
47
TypeScriptのextends
MisakiSoeda
April 23, 2025
Tweet
Share
Other Decks in Programming
See All in Programming
Giselleで作るAI QAアシスタント 〜 Pull Requestレビューに継続的QAを
codenote
0
330
AIの誤りが許されない業務システムにおいて“信頼されるAI” を目指す / building-trusted-ai-systems
yuya4
7
4.3k
Flutter On-device AI로 완성하는 오프라인 앱, 박제창 @DevFest INCHEON 2025
itsmedreamwalker
1
190
AIによるイベントストーミング図からのコード生成 / AI-powered code generation from Event Storming diagrams
nrslib
1
1k
今こそ知るべき耐量子計算機暗号(PQC)入門 / PQC: What You Need to Know Now
mackey0225
3
190
TestingOsaka6_Ozono
o3
0
270
「コードは上から下へ読むのが一番」と思った時に、思い出してほしい話
panda728
PRO
39
26k
AI Agent Tool のためのバックエンドアーキテクチャを考える #encraft
izumin5210
6
1.6k
Denoのセキュリティに関する仕組みの紹介 (toranoana.deno #23)
uki00a
0
220
生成AIを利用するだけでなく、投資できる組織へ
pospome
2
440
QAフローを最適化し、品質水準を満たしながらリリースまでの期間を最短化する #RSGT2026
shibayu36
0
1.6k
Claude Codeの「Compacting Conversation」を体感50%減! CLAUDE.md + 8 Skills で挑むコンテキスト管理術
kmurahama
1
710
Featured
See All Featured
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
0
51
The SEO identity crisis: Don't let AI make you average
varn
0
47
Designing Powerful Visuals for Engaging Learning
tmiket
0
200
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.3k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
The Limits of Empathy - UXLibs8
cassininazir
1
200
Java REST API Framework Comparison - PWX 2021
mraible
34
9.1k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.2k
ラッコキーワード サービス紹介資料
rakko
0
1.9M
Leo the Paperboy
mayatellez
1
1.3k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
130
Transcript
!.JTBLJ4PFEB 5ZQF4DSJQUͷFYUFOET .JUBUT
.JTBLJ4PFEB ൃදऀ גࣜձࣾ#PPL-JWF ٕज़։ൃຊ෦γεςϜ։ൃ෦ετΞ։ൃνʔϜ ϑϩϯτΤϯυΤϯδχΞ 5ZQF4DSJQUͰझຯͰόοΫΤϯυॻ͍ͨΓ͍ͯ͠Δ 5ZQF4DSJQU͕͖ʂ ͷ54,BJHJ͔ΒελοϑΛ͍ͯ͠Δ
ͳͥ͜ͷςʔϚʹͨ͠ͷ͔
ʮܕ҆શͬͯɺͲ͏ਂ۷Γ͢ΔΜͩΖ͏ʁʯ w UZQFDIBMMFOHFTʹઓΛ࢝ΊΔʂ w UZQFDIBMMFOHFTΛ௨ͯ͠ؾ͍ͮͨͷ͕ɺܕϨϕϧͰͷߜΓࠐΈૢ࡞͕ܕ҆ શੑΛܶతʹߴΊͯ͘ΕΔͱ͍͏͜ͱɻ w ಛʹFYUFOETΛͬͨܕૢ࡞͕ҹతͰͨ͠ɻ
FYUFOETͷجຊ
FYUFOETͷجຊ w ܕҾ w Ϋϥεͷܧঝ
FYUFOETͷجຊ w ܕҾɹˡͪ͜Βͷ͓ w Ϋϥεͷܧঝ
FYUFOETͷجຊ T extends U ? X : Y w FYUFOETʮܕ͕݅Λຬ͍ͨͯ͠Δ͔ʁʯΛஅ͢Δ݅ܕͷΩʔߏจɻ
w ଞͷUZQFPGJO͕࣮ߦ࣌ͷʹج͍ͮͯܕΛߜΓࠐΉͷʹର͠ɺ FYUFOETΛͬͨ݅ܕ ʮܕͦͷͷ͚ͩΛݟͯॲཧΛ͚Δʯ७ਮͳܕϨϕϧͷذͰ͢ɻ
ྫ6OJPOܕͷϑΟϧλϦϯά త6OJPO͔Βಛఆͷܕ͚ͩநग़ type OnlyStrings<T> = T extends string ? T
: never; type Mixed = "hello" | 42 | "world"; type JustStrings = OnlyStrings<Mixed>; // "hello" | "world" 6OJPOܕʹରͯ͠5FYUFOETʜͱॻ͘ͱɺ֤ߏཁૉʹରͯ͠ݸผʹධՁ͞ ΕΔlzͱ͍͏༷͕͋Γ·͢ɻ
ྫΦϒδΣΫτͷܕΛಛఆ͢Δ తಛఆͷϓϩύςΟΛ࣋ͭܕ͚ͩΛநग़ type Event = | { type: "click"; x:
number } | { type: "scroll"; y: number }; type ExtractByType<T, K extends string> = T extends { type: K } ? T : never; type ClickEvent = ExtractByType<Event, "click">; // => { type: "click"; x: number }
ྫFYUFOETͷ͍ํʢ੍ˍ݅ܕʣ // ੍ͱͯ͠ͷextends function logLength<T extends { length: number }>(value:
T) { console.log(value.length); } // ݅ܕͱͯ͠ͷextends type OnlyStrings<T> = T extends string ? T : never;
݅ܕͰͷFYUFOETͷϝϦοτ w ܕͷ҆શੑ্͕ʢ༧ظ͠ͳ͍ܕΛ͚Δʣ w ॊೈͳܕૢ࡞͕Ͱ͖ΔʢܕϨϕϧͰ fi MUFSNBQ͕Մೳʣ w ܕਪ͕ਖ਼֬ʹͳΔʢิ͕ޮ͖͘͢ͳΔʣ
·ͱΊ
·ͱΊ w ܕϨϕϧͷૢ࡞ܕ҆શੑͷ伴ʂ w ݅ܕʹΑΔFYUFOETɺܕͷذɾબʹڧྗɻ w UZQFDIBMMFOHFTͰɺܕͷײ֮Λ͑Δͷ͓͢͢Ίʂ