Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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.6k
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
12k
Podcastを継続する技術 / refactoradio-240119
okunokentaro
1
190
Webアプリケーション設計の第一歩は ディレクトリの整理から / Encraft 1
okunokentaro
34
10k
JSONとJSON Schemaを改めて理解する / tokyo_study
okunokentaro
9
2.4k
それでもどうしてRecoilを使うのか / Harajuku.ts Meetup Recoil
okunokentaro
19
5.6k
TypeScriptは10年でこんなに進化しました / TechFeed Experts Night 11
okunokentaro
6
1.8k
Hasura.io RDBをサクサク作る方法はARやO/RMだけじゃなくなりました/hasura-io
okunokentaro
5
690
コードには型アノテーションよりも要件アノテーションを増やせ!/harajukuts2
okunokentaro
14
6.5k
10年と3ヶ月でWebサービスを作った話 / Piyogrammer Conference 2021
okunokentaro
2
1.1k
Other Decks in Technology
See All in Technology
シニアソフトウェアエンジニアになるためには
kworkdev
PRO
3
200
IAMユーザーゼロの運用は果たして可能なのか
yama3133
2
510
AWSに革命を起こすかもしれない新サービス・アップデートについてのお話
yama3133
0
170
特別捜査官等研修会
nomizone
0
170
S3を正しく理解するための内部構造の読解
nrinetcom
PRO
3
210
2025年 開発生産「可能」性向上報告 サイロ解消からチームが能動性を獲得するまで/ 20251216 Naoki Takahashi
shift_evolve
PRO
2
210
Amazon Quick Suite で始める手軽な AI エージェント
shimy
1
1k
AWSを使う上で最低限知っておきたいセキュリティ研修を社内で実施した話 ~みんなでやるセキュリティ~
maimyyym
2
1.8k
打 造 A I 驅 動 的 G i t H u b ⾃ 動 化 ⼯ 作 流 程
appleboy
0
370
Microsoft Agent 365 についてゆっくりじっくり理解する!
skmkzyk
0
410
AIBuildersDay_track_A_iidaxs
iidaxs
3
400
AIプラットフォームにおけるMLflowの利用について
lycorptech_jp
PRO
1
170
Featured
See All Featured
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.2k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.8k
We Have a Design System, Now What?
morganepeng
54
7.9k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
180
Discover your Explorer Soul
emna__ayadi
2
1k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
25
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.3k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
37
2.7k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
46
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
0
22
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Λۦͯ͠ઈରʹܕ͚͍ͯ͜͠͏