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
AtCoder Conference 2025
shindannin
0
1k
[KNOTS 2026登壇資料]AIで拡張‧交差する プロダクト開発のプロセス および携わるメンバーの役割
hisatake
0
240
コマンドとリード間の連携に対する脅威分析フレームワーク
pandayumi
1
440
Apache Iceberg V3 and migration to V3
tomtanaka
0
140
2026年 エンジニアリング自己学習法
yumechi
0
130
AI 駆動開発ライフサイクル(AI-DLC):ソフトウェアエンジニアリングの再構築 / AI-DLC Introduction
kanamasa
12
6.3k
Unicodeどうしてる? PHPから見たUnicode対応と他言語での対応についてのお伺い
youkidearitai
PRO
1
1.1k
CSC307 Lecture 09
javiergs
PRO
1
810
IFSによる形状設計/デモシーンの魅力 @ 慶應大学SFC
gam0022
1
290
Vibe Coding - AI 驅動的軟體開發
mickyp100
0
170
AI Agent Tool のためのバックエンドアーキテクチャを考える #encraft
izumin5210
6
1.8k
なぜSQLはAIぽく見えるのか/why does SQL look AI like
florets1
0
440
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
9.8k
The Curse of the Amulet
leimatthew05
1
8.1k
The SEO Collaboration Effect
kristinabergwall1
0
350
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
0
130
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
110
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
95
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.2k
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.4k
WCS-LA-2024
lcolladotor
0
440
How STYLIGHT went responsive
nonsquared
100
6k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
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Ͱɺܕͷײ֮Λ͑Δͷ͓͢͢Ίʂ