Slide 1

Slide 1 text

NoInfer 2023.12.22 Quramy

Slide 2

Slide 2 text

ແྉ̑෼ͷ-5Ͱɺܕਪ࿦΍ λΠϓνΣοΧʔ͕෼͔Δ ʮ/P*OGFSͱܕ୅ೖʯɻ 5ZQF4DSJQUʹೖΔ͔΋ʂ ݁Ռ΋͙͢෼͔Δͱେਓؾɻ ͏Θͬ…ࢲͷܕਪ࿦ɺ 
 ؇͗͢…ʁ(30୅உੑ2͞Μͷ৔߹) ͋ͳͨͷదਖ਼δΣωϦΫε͸ʁ UTDTUSJDU

Slide 3

Slide 3 text

͜ͷܕఆٛ͋ͬͯΔʁ - ͓୊: ಉ͡ܕͷҾ਺ a ͱ b ͕Ұக͍ͯ͠Δ͔ݕࠪ͢Δؔ਺ - a ͱ b ͷܕ͕ҟͳΔ৔߹͸ίϯύΠϧΤϥʔͱ͍ͨ͠ declare function isEqual(a: T, b: T): boolean; isEqual(100, 200); isEqual("hoge", "fuga"); // @ts-expect-error isEqual("hoge", 200);

Slide 4

Slide 4 text

Τϥʔʹ͠ΖͬͭͬͯΜͩΖ 😇 - ͓୊: ಉ͡ܕͷҾ਺ a ͱ b ͕Ұக͍ͯ͠Δ͔ݕࠪ͢Δؔ਺ - a ͱ b ͷܕ͕ҟͳΔ৔߹͸ίϯύΠϧΤϥʔͱ͍ͨ͠ declare function isEqual(a: T, b: T): boolean; isEqual( { id: "100", name: "hoge" }, { code: "200", name: "foo" }, );

Slide 5

Slide 5 text

T ͕ਪ࿦͞Εա͍͗ͯΔ - isEqueal ͷܕύϥϝʔλ T ͕ͲͷΑ͏ʹਪ࿦͞Ε͍ͯΔ͔ͱ͍͏ͱ: - ʮҾ਺ a, b ૒ํΛ୅ೖՄೳͳܕʯΛ Type Checker ͕ؤுͬͯਪ࿦ͯ͠ ͨ݁͠Ռɺ؇͍ܕʹͳͬͯ͠·͍ͬͯΔ - ʮҾ਺ b ͸ a ͱಉܕͰ͋Δ͜ͱʯ ΛදݱͰ͖͍ͯͳ͍ isEqual< | { id: string, name: string, code?: undefined } | { id?: undefined, name: string, code: string } >( { id: "100", name: "hoge" }, { code: "200", name: "foo" }, );

Slide 6

Slide 6 text

ਪ࿦Λҙਤతʹఀࢭͤ͞Δ - TypeScript 5.4 Ͱ NoInfer ͱ͍͏૊ΈࠐΈܕͷ࣮૷͕ਐΜͰ͍Δ 
 ※ 2023.12.22 Ͱ͸ not merged - https://github.com/microsoft/TypeScript/pull/56794 (օେ޷͖ Hejlsberg ޚେ) - NoInfer ͰϚʔΫ͞Εͨܕ͸ɺܕਪ࿦ͷ݁ՌʹӨڹ͠ͳ͍ 
 ্هྫͰ͸ɺҾ਺ b ͷܕ ͸ T ͦͷ΋ͷ ( i.e. Ҿ਺ a ͚ͩͰਪ࿦͞ΕΔ) declare function isEqual(a: T, b: NoInfer): boolean; isEqual( { id: "100", name: "hoge" }, { code: "200", name: "foo" }, );

Slide 7

Slide 7 text

type NoInfer = intrinsic; - NoInfer ͸ Intrinsic ͳܕ (͜ΕҎ্ଞͷܕͰදݱͰ͖ͳ͍ܕ) - Uppercase ΍ Uncapitalize ͳͲ TS 4.1 Ͱ஀ੜͨ͠ 4छͷΈ. 
 ࠓճͷ PR Ͱ͸ٱ͠ͿΓʹ5൪໨ͷ Intrinsic type ͕௥Ճ͞Ε͍ͯΔ - (༨ஊ) Uppercase ΍ Uncapitalize Λ௥Ճͨ͠ͷ΋ Hejlsberg ͳͷͰɺ Intrinsic Type ͸ޚେͷ੟Ҭͷ··

Slide 8

Slide 8 text

NoInfer ͷ࢓૊Έ - NoInfer ͸ɺܕύϥϝʔλͰ͸ͳ͘ ܕ୅ೖ ( Type Substitution) ͱ͠ ͯѻ͏Α͏ʹ࣮૷͞Ε͍ͯΔ - ܕ୅ೖ͸ʮʰ ଎΍͔ʹ T ͷܕΛల։ͯ͠Ͷʱͱ͍͏໋ྩʯͷΑ͏ͳ΋ͷ - طଘͷ TypeScript Ͱܕ୅ೖͱݟͳ͞ΕΔՕॴ͸ Conditional Type ͷΈ 
 ※ Type Substitution ࣗମɺ Conditional Type ͷͨΊʹ࣮૷͞Εͨ࢓૊Έ type Condition = T extends S // ͜ͷ T ͸ܕύϥϝʔλ ? T // ͜ͷ T ͸ܕ୅ೖ : U

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

- ܕ୅ೖ͸୅ೖର৅ͷܕ͕ຬ੍ͨ͢໿ͷܕΛอ͍࣋ͯ͠Δ - NoInfer ͷ࣮ମ͸ɺ੍໿ʹ unknown Λ༩͑ͨ T ΁ͷ ܕ୅ೖ 
 ͱɺ΄ͱΜͲͷจ຺Ͱಉ͡ҙຯ - unknown ͸ Top Type Ͱ͋ΔͨΊɺطଘͷ TS ʹ͸ ʮ unknown Λ੍໿ ͱͨ͠ܕ୅ೖʯ͸ଘࡏ͠ͳ͍ ʢ࡞Εͳ͍Α͏ʹͳ͍ͬͯͨ) 
 ͢ͳΘͪʮunknown Λ੍໿ͱͨ͠ܕ୅ೖ͸ NoInferͰ͋Δʯ͕੒ཱ͢Δ - ʮܕਪ࿦தʹ unknown Λ੍໿ͱͨ͠ܕ୅ೖ͕ग़ݱͨ͠Βɺਪ࿦Λఀࢭ ͢Δʯͱ͍͏ϩδοΫ͕௥Ճ͞Ε͍ͯΔ͚ͩ - NoInfer ͸ طଘͷ Type checker ͕࣋ͭ࢓૊Έ͚ͩͰ࣮ݱ͞Ε͍ͯΔ type NoInfer = T type Condition = T extends S ? T // ͜ͷ T ͸ܕ୅ೖ. ͨͩ͠ T ͸੍໿ S Λຬ͍ͨͯ͠Δ͜ͱ͕อূ͞Ε͍ͯΔ : U

Slide 11

Slide 11 text

͓ΘΓʹ - ਪ࿦ΛࢭΊ͍ͨ৔߹͸ NoInfer - ௨ৗͷΞϓϦέʔγϣϯίʔυͰ NoInfer ͕໾ʹཱͭ͜ͱ͸كͳ͸ͣ - ҙࣝ͢Δͷ͸ϥΠϒϥϦ࡞ऀ 
 ࠓճͷ PR ΋ XState ίΞίϛολͷਓ͕ߟ͑ͨ෺͕ݪҊͱͳ͍ͬͯΔ 
 https://github.com/microsoft/TypeScript/pull/52968 - TS Type checker ʹͯ࠷খݶͷ࿑ྗͰਪ࿦ΛࢭΊΔ࢓૊Έ͕໘ന͍