Slide 1

Slide 1 text

5ZQF4DSJQUͰ ςε τίʔ υΛపఈతʹܕਪ࿦͢Δ +VO 5ZQF4DSJQU.FFUVQ !PLVOPLFOUBSP

Slide 2

Slide 2 text

୭ w Ԟ໺ݡଠ࿠!PLVOPLFOUBSP w 5ZQF4DSJQUϑϩϯ τΤϯ υ ɾ όοΫΤϯ υ w "OHVMBS೔ຊϢʔβʔձ w OHKBQBO0O"JSύʔιφϦςΟ

Slide 3

Slide 3 text

ςε τίʔ υ BOZͰఘΊ͍ͯ·ͤΜ͔

Slide 4

Slide 4 text

ྫ͑͹ describe('TasksService', () => { let spy: any; beforeEach(() => { // 略 spy = jest.spyOn(tasksService, 'fetchTasks'); }); test('テスト', () => { // 略 }); });

Slide 5

Slide 5 text

describe('TasksService', () => { let spy: any; beforeEach(() => { // 略 spy = jest.spyOn(tasksService, 'fetchTasks'); }); test('テスト', () => { // 略 }); }); ྫ͑͹

Slide 6

Slide 6 text

describe('TasksService', () => { let spy: any; beforeEach(() => { // 略 spy = jest.spyOn(tasksService, 'fetchTasks'); }); test('テスト', () => { // 略 }); }); ྫ͑͹

Slide 7

Slide 7 text

ͳͥBOZʹͯ͠͠· ͏ͷ͔ w ܕఆٛΛ࢖͍͍͚ͨͲɺ .d.tsΛಡΜͰ΋ҙຯ͕෼͔Βͳ͔ͬͨ w γϯϓϧͳܕఆٛ͡Όͳ͘ ͯδΣωϦΫεͷࢦఆ͕ඞཁ w ͦ͜ʹԿΛࢦఆͨ͠Β͍͍͔෼͔Βͣɺ ͍ͭ·Ͱ΋ίϯύΠϧΤϥʔʹͳΔ w ఘΊͯanyʹ͓ͯ͘͠

Slide 8

Slide 8 text

KFTUTQZ0Oͷܕఆٛ https://github.com/DefinitelyTyped/DefinitelyTyped/blob/f9f8e5ac0f73721b8ec393767a8caeffe93beeb1/types/jest/index.d.ts#L273-L294

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

ͲΕΛ࢖͑͹͍͍ͷ ʁ Ͳͬͪ ʁ ʁ ͜ͷ௕͍ͷ͸Կ ʁ ʁ

Slide 11

Slide 11 text

ͭ͋Δͷ͸0WFSMPBET https://www.typescriptlang.org/docs/handbook/functions.html#overloads ্͔ΒॱʹධՁ ͯ͠߹கͨ͠΋ͷ͕ ࢖ΘΕΔ

Slide 12

Slide 12 text

5͸ԿΒ͔ͷΦϒδΣΫ τ ٸʹ\^ͬͯॻ͔ΕΔͱ ͼͬ͘ Γ͢Δ͚Ͳɺ ͨͩͷ ۭ0CKFDU-JUFSBM VOEFpOFE OVMMҎ֎ͷ஋͸ ͍ͣΕ΋\^Λຬͨ͢

Slide 13

Slide 13 text

.͕ॏཁ

Slide 14

Slide 14 text

ͱ Γ͋͑ͣԿΒ͔ͷจࣈྻͩ https://github.com/DefinitelyTyped/DefinitelyTyped/blob/f9f8e5ac0f73721b8ec393767a8caeffe93beeb1/types/jest/index.d.ts#L319-L324

Slide 15

Slide 15 text

.BQQFE5ZQFT $POEJUJPOBM5ZQFT https://github.com/DefinitelyTyped/DefinitelyTyped/blob/f9f8e5ac0f73721b8ec393767a8caeffe93beeb1/types/jest/index.d.ts#L319-L324 ࠓͲ͖ͷ޻෉ͷڽΒ͞Εͨ5ZQF4DSJQUܕఆٛ͸ άάΓʹ͍͘ߏจ͕ͨ͘ ͞Μ ͍Ζ͍Ζग़͖ͯͯϫέΘ͔ΒΜ͔΋͠Εͳ͍͚Ͳ ͻͱͭͣͭղܾ͍ͯ͜͠͏ .BQQFE5ZQFT $POEJUJPOBM5ZQFT -PPLVQ5ZQFT ͜Ε͸"SSBZBOZͷTVHBS

Slide 16

Slide 16 text

.BQQFE5ZQFT https://github.com/DefinitelyTyped/DefinitelyTyped/blob/f9f8e5ac0f73721b8ec393767a8caeffe93beeb1/types/jest/index.d.ts#L319-L324 5͕࣋ͭશͯͷϓϩύςΟ Λʜ Α Γӈʹهड़͞Εͨܕʹ͢Δ

Slide 17

Slide 17 text

$POEJUJPOBM5ZQFT https://github.com/DefinitelyTyped/DefinitelyTyped/blob/f9f8e5ac0f73721b8ec393767a8caeffe93beeb1/types/jest/index.d.ts#L319-L324 ͦͷܕ͕ࢦఆͷ৚݅Λʜ ຬͨ͢ͳΒ  ຬͨ͞ͳ͍ͳΒҎ߱ ͷܕͱͳΔ

Slide 18

Slide 18 text

΋͏Ұ౓ಡΜͰΈΔͱ ୈҾ਺͕ʜ ΦϒδΣΫ τ5ͷ࣋ͭ ϓϩύςΟ໊ͳΒ͹ ୈҾ਺͕HFU͔TFU͔ʹԠͯ͡ৼΓ෼͚ ΦϒδΣΫ τ5ͷ࣋ͭ ϝ ιο υ໊ͳΒ͹ͭΊͷ0WFSMPBETΛద༻ ͭ· Γωε τͨ͠JGจͷΑ ͏ʹಡΊΔ

Slide 19

Slide 19 text

Ͳͷ0WFSMPBET͔෼͔Ε͹ͦͷ໭ΓܕΛݟΔ ୈҾ਺ʹΠϯελϯεɺ  ୈҾ਺ʹͦͷΠϯελϯε͕࣋ͭϝ ιο υ໊ Λ౉ͤ͹SpyInstance͕ฦΔ Ͱ͸ReturnType ArgsTypeͱ͸ ʁ ʁ

Slide 20

Slide 20 text

Ϗϧ τΠϯͷ$POEJUJPOBM5ZQFT w lib.d.tsʹ͸5ZQF4DSJQUʹඪ४Ͱ૊Έࠐ·Ε͍ͯΔ $POEJUJPOBM5ZQFT͕ଘࡏ͢Δ w ReturnType΋ͦͷͻͱͭ wʮstringΛฦؔ͢਺ʯ ΛTʹ౉ͤ͹ɺ ReturnType͸stringͱͳΔ

Slide 21

Slide 21 text

ࣗ࡞ͷ$POEJUJPOBM5ZQFT w +FTUͷܕఆٛͰ͸ArgsTypeͱ͍͏ܕ͕ಠࣗʹఆٛ͞Ε͍ͯΔ w  w ΋͠T͕extendsҎ߱ͷܕͱϚονͨ͠Βɺ ͦͷ࣌ͷҾ਺ܕAΛฦ͢ͱ͍͏ҙ ʢϚον͠ͳ͚Ε͹neverΛฦ͢ʣ  w inferΛ࢖ͬͯ৚݅ʹϚονͨ͠ͱ͖ͷ֘౰ՕॴΛɺ ໭ΓܕଆͰѻ͑Δ type ArgsType = T extends (...args: infer A) => any ? A : never;

Slide 22

Slide 22 text

"OHVMBSͷ5FTU#FEʹ ຊؾͰܕΛ෇͚ͯΈΔ

Slide 23

Slide 23 text

ઈରʹܕ෇͚ΛఘΊͳ͍ w "OHVMBS͸%*ίϯςφΛඋ͑Δ w ςε τ࣮ࢪ࣌ʹಛఆͷαʔϏεΛϞοΫʹࠩ͠ସ࣮͑ͯߦͰ͖Δ w ΦϑΟ γϟϧͷܕఆٛ͸͍͍ͩͨanyͱॻ͔ΕͯΔ w ώϡʔϚϯΤϥʔ͕ى͖΍͍͢ w anyͷ··ͰఘΊͳ͍

Slide 24

Slide 24 text

%FQFOEFODJFT5ܕ import { Type } from '@angular/core'; type MapToConstructorType = { [P in keyof T]: Type }; export type Dependencies< T extends new (...args: any) => any > = MapToConstructorType>; w Router, TranslateService, UsersServiceΛ%*͢Δ MyComponent͕͋ͬͨͱ͢Δ w Dependencies͸ [typeof Router, typeof TranslateService, typeof UsersService]ͱͷޓ׵ܕฦ͢

Slide 25

Slide 25 text

·ͱΊ w ࠷ۙͷϞμϯͳܕఆٛϑΝΠϧ͸ɺ ͻͨ͢Β܁Γฦ͠ͱ৚݅෼ذ w .BQQFE5ZQFT $POEJUJPOBM5ZQFTΛۦ࢖ͯ͠ઈରʹܕ෇͚͍ͯ͜͠͏