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でテストコードを徹底的に型推論する / TypeScript Meetup 4
Search
OKUNOKENTARO
June 16, 2020
Technology
8
3.5k
TypeScriptでテストコードを徹底的に型推論する / TypeScript Meetup 4
2020年6月16日 TypeScript Meetup #4 にて発表した資料です。
OKUNOKENTARO
June 16, 2020
Tweet
Share
More Decks by OKUNOKENTARO
See All by OKUNOKENTARO
トレタO/X アーキテクチャ移行記 Next.js App Router化への道のり / TORETA TECH UPDATE 1
okunokentaro
5
11k
Podcastを継続する技術 / refactoradio-240119
okunokentaro
1
170
Webアプリケーション設計の第一歩は ディレクトリの整理から / Encraft 1
okunokentaro
34
10k
JSONとJSON Schemaを改めて理解する / tokyo_study
okunokentaro
9
2.3k
それでもどうしてRecoilを使うのか / Harajuku.ts Meetup Recoil
okunokentaro
19
5.5k
TypeScriptは10年でこんなに進化しました / TechFeed Experts Night 11
okunokentaro
6
1.7k
Hasura.io RDBをサクサク作る方法はARやO/RMだけじゃなくなりました/hasura-io
okunokentaro
5
660
コードには型アノテーションよりも要件アノテーションを増やせ!/harajukuts2
okunokentaro
14
6.3k
10年と3ヶ月でWebサービスを作った話 / Piyogrammer Conference 2021
okunokentaro
2
1k
Other Decks in Technology
See All in Technology
GitHub MCP Serverを使って Pull Requestを作る、レビューする
hiyokose
2
600
SSH公開鍵認証による接続 / Connecting with SSH Public Key Authentication
kaityo256
PRO
2
270
生成AI時代のセキュアCI/CDとソース管理
yuriemori
0
110
大規模プロジェクトにおける 品質管理の要点と実践 / 20250327 Suguru Ishii
shift_evolve
0
320
17年のQA経験が導いたスクラムマスターへの道 / 17 Years in QA to Scrum Master
toma_sm
0
510
NLP2025 参加報告会 / NLP2025
sansan_randd
4
310
Tirez profit de Messenger pour améliorer votre architecture
tucksaun
1
210
AIエージェント開発における「攻めの品質改善」と「守りの品質保証」 / 2024.04.09 GPU UNITE 新年会 2025
smiyawaki0820
0
250
AIエージェントの地上戦 〜開発計画と運用実践 / 2025/04/08 Findy W&Bミートアップ #19
smiyawaki0820
17
4.7k
自分の軸足を見つけろ
tsuemura
1
170
チームビルディング「脅威モデリング」ワークショップ
koheiyoshikawa
0
180
Beyond {shiny}: The Future of Mobile Apps with R
colinfay
0
220
Featured
See All Featured
Build The Right Thing And Hit Your Dates
maggiecrowley
34
2.6k
How to Ace a Technical Interview
jacobian
276
23k
The Invisible Side of Design
smashingmag
299
50k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
12k
Designing for humans not robots
tammielis
251
25k
Code Review Best Practice
trishagee
67
18k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
102
19k
4 Signs Your Business is Dying
shpigford
183
22k
How to train your dragon (web standard)
notwaldorf
91
6k
Gamification - CAS2011
davidbonilla
81
5.2k
Making the Leap to Tech Lead
cromwellryan
133
9.2k
Transcript
5ZQF4DSJQUͰ ςε τίʔ υΛపఈతʹܕਪ͢Δ +VO 5ZQF4DSJQU.FFUVQ !PLVOPLFOUBSP
୭ w Ԟݡଠ!PLVOPLFOUBSP w 5ZQF4DSJQUϑϩϯ τΤϯ υ ɾ όοΫΤϯ υ
w "OHVMBSຊϢʔβʔձ w OHKBQBO0O"JSύʔιφϦςΟ
ςε τίʔ υ BOZͰఘΊ͍ͯ·ͤΜ͔
ྫ͑ describe('TasksService', () => { let spy: any; beforeEach(() =>
{ // 略 spy = jest.spyOn(tasksService, 'fetchTasks'); }); test('テスト', () => { // 略 }); });
describe('TasksService', () => { let spy: any; beforeEach(() => {
// 略 spy = jest.spyOn(tasksService, 'fetchTasks'); }); test('テスト', () => { // 略 }); }); ྫ͑
describe('TasksService', () => { let spy: any; beforeEach(() => {
// 略 spy = jest.spyOn(tasksService, 'fetchTasks'); }); test('テスト', () => { // 略 }); }); ྫ͑
ͳͥBOZʹͯ͠͠· ͏ͷ͔ w ܕఆٛΛ͍͍͚ͨͲɺ .d.tsΛಡΜͰҙຯ͕͔Βͳ͔ͬͨ w γϯϓϧͳܕఆٛ͡Όͳ͘ ͯδΣωϦΫεͷࢦఆ͕ඞཁ w ͦ͜ʹԿΛࢦఆͨ͠Β͍͍͔͔Βͣɺ
͍ͭ·ͰίϯύΠϧΤϥʔʹͳΔ w ఘΊͯanyʹ͓ͯ͘͠
KFTUTQZ0Oͷܕఆٛ https://github.com/DefinitelyTyped/DefinitelyTyped/blob/f9f8e5ac0f73721b8ec393767a8caeffe93beeb1/types/jest/index.d.ts#L273-L294
None
ͲΕΛ͍͍͑ͷ ʁ Ͳͬͪ ʁ ʁ ͜ͷ͍ͷԿ ʁ ʁ
ͭ͋Δͷ0WFSMPBET https://www.typescriptlang.org/docs/handbook/functions.html#overloads ্͔ΒॱʹධՁ ͯ͠߹கͨ͠ͷ͕ ΘΕΔ
5ԿΒ͔ͷΦϒδΣΫ τ ٸʹ\^ͬͯॻ͔ΕΔͱ ͼͬ͘ Γ͢Δ͚Ͳɺ ͨͩͷ ۭ0CKFDU-JUFSBM VOEFpOFE OVMMҎ֎ͷ ͍ͣΕ\^Λຬͨ͢
.͕ॏཁ
ͱ Γ͋͑ͣԿΒ͔ͷจࣈྻͩ https://github.com/DefinitelyTyped/DefinitelyTyped/blob/f9f8e5ac0f73721b8ec393767a8caeffe93beeb1/types/jest/index.d.ts#L319-L324
.BQQFE5ZQFT $POEJUJPOBM5ZQFT https://github.com/DefinitelyTyped/DefinitelyTyped/blob/f9f8e5ac0f73721b8ec393767a8caeffe93beeb1/types/jest/index.d.ts#L319-L324 ࠓͲ͖ͷͷڽΒ͞Εͨ5ZQF4DSJQUܕఆٛ άάΓʹ͍͘ߏจ͕ͨ͘ ͞Μ ͍Ζ͍Ζग़͖ͯͯϫέΘ͔ΒΜ͔͠Εͳ͍͚Ͳ ͻͱͭͣͭղܾ͍ͯ͜͠͏ .BQQFE5ZQFT $POEJUJPOBM5ZQFT
-PPLVQ5ZQFT ͜Ε"SSBZBOZͷTVHBS
.BQQFE5ZQFT https://github.com/DefinitelyTyped/DefinitelyTyped/blob/f9f8e5ac0f73721b8ec393767a8caeffe93beeb1/types/jest/index.d.ts#L319-L324 5͕࣋ͭશͯͷϓϩύςΟ Λʜ Α Γӈʹهड़͞Εͨܕʹ͢Δ
$POEJUJPOBM5ZQFT https://github.com/DefinitelyTyped/DefinitelyTyped/blob/f9f8e5ac0f73721b8ec393767a8caeffe93beeb1/types/jest/index.d.ts#L319-L324 ͦͷܕ͕ࢦఆͷ݅Λʜ ຬͨ͢ͳΒ ຬͨ͞ͳ͍ͳΒҎ߱ ͷܕͱͳΔ
͏ҰಡΜͰΈΔͱ ୈҾ͕ʜ ΦϒδΣΫ τ5ͷ࣋ͭ ϓϩύςΟ໊ͳΒ ୈҾ͕HFU͔TFU͔ʹԠͯ͡ৼΓ͚ ΦϒδΣΫ τ5ͷ࣋ͭ ϝ ιο
υ໊ͳΒͭΊͷ0WFSMPBETΛద༻ ͭ· Γωε τͨ͠JGจͷΑ ͏ʹಡΊΔ
Ͳͷ0WFSMPBET͔͔ΕͦͷΓܕΛݟΔ ୈҾʹΠϯελϯεɺ ୈҾʹͦͷΠϯελϯε͕࣋ͭϝ ιο υ໊ ΛͤSpyInstance<T, Y>͕ฦΔ ͰReturnType ArgsTypeͱ
ʁ ʁ
Ϗϧ τΠϯͷ$POEJUJPOBM5ZQFT w lib.d.tsʹ5ZQF4DSJQUʹඪ४ͰΈࠐ·Ε͍ͯΔ $POEJUJPOBM5ZQFT͕ଘࡏ͢Δ w ReturnType<T>ͦͷͻͱͭ wʮstringΛฦؔ͢ʯ ΛTʹͤɺ ReturnType<T>stringͱͳΔ
ࣗ࡞ͷ$POEJUJPOBM5ZQFT w +FTUͷܕఆٛͰArgsType<T>ͱ͍͏ܕ͕ಠࣗʹఆٛ͞Ε͍ͯΔ w w ͠T͕extendsҎ߱ͷܕͱϚονͨ͠Βɺ ͦͷ࣌ͷҾܕAΛฦ͢ͱ͍͏ҙ ʢϚον͠ͳ͚ΕneverΛฦ͢ʣ
w inferΛͬͯ݅ʹϚονͨ͠ͱ͖ͷ֘ՕॴΛɺ ΓܕଆͰѻ͑Δ type ArgsType<T> = T extends (...args: infer A) => any ? A : never;
"OHVMBSͷ5FTU#FEʹ ຊؾͰܕΛ͚ͯΈΔ
ઈରʹܕ͚ΛఘΊͳ͍ w "OHVMBS%*ίϯςφΛඋ͑Δ w ςε τ࣮ࢪ࣌ʹಛఆͷαʔϏεΛϞοΫʹࠩ͠ସ࣮͑ͯߦͰ͖Δ w ΦϑΟ γϟϧͷܕఆ͍͍ٛͩͨanyͱॻ͔ΕͯΔ w
ώϡʔϚϯΤϥʔ͕ى͖͍͢ w anyͷ··ͰఘΊͳ͍
%FQFOEFODJFT5ܕ import { Type } from '@angular/core'; type MapToConstructorType<T extends
any[]> = { [P in keyof T]: Type<T[P]> }; export type Dependencies< T extends new (...args: any) => any > = MapToConstructorType<ConstructorParameters<T>>; w Router, TranslateService, UsersServiceΛ%*͢Δ MyComponent͕͋ͬͨͱ͢Δ w Dependencies<typeof MyComponent> [typeof Router, typeof TranslateService, typeof UsersService]ͱͷޓܕฦ͢
·ͱΊ w ࠷ۙͷϞμϯͳܕఆٛϑΝΠϧɺ ͻͨ͢Β܁Γฦ͠ͱ݅ذ w .BQQFE5ZQFT $POEJUJPOBM5ZQFTΛۦͯ͠ઈରʹܕ͚͍ͯ͜͠͏