kansai.ts #1 ( https://kansaits.connpass.com/event/130120/ ) でTypeScriptの便利なbuilt-in typesについて話をしました。 質問はTwitter( https://twitter.com/shisama_ )までお願いいたします。
Advancedbuilt-in typesyou may not knowMasashi Hirano @shisamakansai.ts #1
View Slide
ฏ ণ࢜ / Masashi Hirano@shisama_@shisamaNode.js Core CollaboratorؔNodeֶԂOrganizer
TypeScriptʹbuilt-in͞Ε͍ͯΔศརͳܕʹ͍ͭͯհ͠·͢ʂ
https://www.typescriptlang.org/docs/handbook/advanced-types.htmlެࣜͷAdvanced TypesಡΜͩ͜ͱ͋Δ?
Advanced Types• Conditional TypesMapped TypesͳͲෳࡶͳܕUnion TypesͳͲศརͳه๏ͳͲΛհ͍ͯ͠Δެࣜͷϖʔδ• ࠓճͦͷத͔Βbuilt-in͞Ε͍ͯΔศརͳܕΛհ͠·͢ ※ܕఆٛΛಡΉʹConditional TypesMapped Types͕ಡΊΔඞཁ͕͋Γ·͢ɻ
https://github.com/microsoft/TypeScript/blob/master/src/lib/es5.d.ts5ZQF4DSJQUͷ(JU)VCϦϙδτϦͷTSDMJCFTEUTʹఆ͕ٛ͋Δ
type Partial = {[P in keyof T]?: T[P];};
type Partial = {[P in keyof T]?: T[P];};LFZPG5 ΦϒδΣΫτͷϓϩύςΟ໊Λऔ͍ͬͯΔϓϩύςΟʹ Λ༩ͯ͠PQUJPOBMʹ͍ͯ͠ΔJO5ͷϓϩύςΟ໊Λ1ʹ֨ೲ͍ͯ͠Δɻ5<1>ࢦఆͨ͠ϓϩύςΟͷܕ
Partialͯ͢ͷϓϩύςΟΛ0QUJPOBMʹ͢Δ
Partial
Partial6TFSJE͕ඞਢͳͷͰۭΦϒδΣΫτίϯύΠϧΤϥʔʹͳΔɻ 1BSUJBM6TFSͯ͢ͷϓϩύςΟ͕0QUJPOBMʹͳΔͨΊۭΦϒδΣΫτΛೖͰ͖Δ
type Required = {[P in keyof T]-?: T[P];};
type Required = {[P in keyof T]-?: T[P];}; PQUJPOBMͷϓϩύςΟΛOPOPQUJPOBMʹ͢Δ1BSUJBMͷٯͰ ΛऔΓআ͍͍ͯΔ
Requiredͯ͢ͷϓϩύςΟΛOPOPQUJPOBMʹ͢Δ
Required
Requiredͯ͢ͷϓϩύςΟ͕OPOPQUJPOBMͳͷͰJEলུͰ͖ͳ͍
type Readonly = {readonly [P in keyof T]: T[P];};
type Readonly = {readonly [P in keyof T]: T[P];};ϓϩύςΟͷલʹSFBEPOMZΛॻ͘ͱͦͷϓϩύςΟಡΈऔΓઐ༻ʹͳΔ
Readonlyͯ͢ͷϓϩύςΟΛSFBEPOMZʹ͢Δ
Readonly
Readonlyͯ͢ͷϓϩύςΟΛSFBEPOMZͷͨΊೖෆՄೳ
type Pick = {[P in K]: T[P];};
type Pick = {[P in K]: T[P];};,ʹࢦఆͰ͖Δͷ5ͷϓϩύςΟ໊ͷΈɻ5ʹແ͍ϓϩύςΟ໊Λࢦఆ͢ΔͱΤϥʔʹͳΔ
Pickࢦఆͨ͠ϓϩύςΟͷΈ͢
Pick
Pickࢦఆͨ͠ϓϩύςΟҎ֎ΤϥʔʹͳΔ
type Record = {[P in K]: T;};
type Record = {[P in K]: T;};lLFZPGBOZzlTUSJOHcOVNCFScTZNCPMz
RecordLFZ໊ͱWBMVFͷܕΛࢦఆͨ͠ΦϒδΣΫτܕΛ࡞Δ
Record
Record-BTUTBUPcUBOBLBͨΊɺTV[VLJΤϥʔʹͳΔ
Record-BTUTBUPcTV[VLJcUBOBLBͨΊɺUBOBLB͕ແ͍ͱΤϥʔʹͳΔ
type Exclude = T extends U ? never : T;
type Exclude = T extends U ? never : T;ࡾ߲ԋࢉࢠͷΑ͏ʹ݅ʹΑͬͯܕ͕ܾ·Δ5͕6Λܧঝ͍ͯ͠Δ߹OFWFSɺͦ͏Ͱͳ͍߹5OFWFSΛฦ͞ͳ͍ܕɻ
Excludeྻڍ͔Βࢦఆͨ͠ΛऔΓআ͘
Exclude
ExcludeऔΓআ͍ͨΛೖ͢ΔͱΤϥʔ
type Extract = T extends U ? T : never;
type Extract = T extends U ? T : never;5͕6Λܧঝ͍ͯ͠Δ߹5ɺͦ͏Ͱͳ͍߹OFWFSΛฦ͍ͯ͠Δɻฦ͕͢&YDMVEFͷٯʹͳ͍ͬͯΔ
Extractྻڍͷத͔Βࢦఆͨ͠Λநग़
Extract
Extractநग़ͨ͠Ҏ֎Λೖ͢ΔͱΤϥʔ
type NonNullable= T extends null | undefined ? never : T;
type NonNullable= T extends null | undefined ? never : T;OVMM·ͨVOEFpOFEΛܧঝ͍ͯ͠ΔܕͰ͋ΕOFWFSɺͦ͏Ͱͳ͍߹5Λฦ͍ͯ͠Δ
NonNullableOVMMͱVOEFpOFEΛऔΓআ͘
NonNullable
NonNullableOVMMVOEFpOFEೖͰ͖ͳ͍
type Parameters(...args: any) => any>= T extends (...args: infer P) => any ? P : never;
type Parameters(...args: any) => any>= T extends (...args: infer P) => any ? P : never;JOGFSܕਪͨ݁͠ՌΛऔΔ͜ͱ͕Ͱ͖Δ͜ͷ߹ؔͷҾͷܕΛਪ͍ͯ͠Δɻ5͕ؔܕ ʜBSHTJOGFS1BOZͷܧঝͩͬͨ߹ɺਪͨ͠ҾͷܕΛฦ͍ͯ͠Δ5ؔܕͷΈࢦఆͰ͖Δ
ParametersؔͷҾͷܕΛλϓϧͰऔΔ
Parameters
ParametersؔͷҾͷܕʹ߹Θͳ͍ͱΤϥʔ
·ͱΊ• ศརͳܕ͕TypeScriptຊମʹΈࠐ·Ε͍ͯΔ• Conditional TypesͱMapped TypesΛͬͯఆٛ͞Ε͍ͯΔ• ࠓհ͖͠Εͳ͔ͬͨܕͷఆٛsrc/lib/es5.d.tsʹ͋ΔͷͰڵຯ͕͋ΕݟͯΈ͍ͯͩ͘͞
Thanks.@shisama_@shisama