Modern TypeScript coding techniques and tips.
Modern TypeScript
View Slide
Name!CSO 5BLFUPTIJ"POP੨݈རOccupation'SPOUFOE%FWFMPQFS1SPEVDU0XOFSCompany$ZCFSBHFOU"EUFDI4UVEJP"*.FTTFOHFSOSS$POUSJCVUPSPG7AboutIUUQJOGPCODI
ຊͷ༰࠷ۙͷTypeScript৽ػೳTips
Null Coalescing
value ?? orValue
// ҎԼͷܗࣜͩͱ0ۭจࣈʹҾ͔͔ͬΔvalue || orValuevalue? value: orValue// Null CoalescingҎԼͷܗࣜͱಉ͡ޮՌvalue != null? value: orValue
Null Coalescing͕null/undefinedͷ߹ʹ??Ҏ߱Λ࣮ߦ͢ΔཧORͷԋࢉࢠࠓޙ΄ͱΜͲ͏ඞཁͳ͍·ͨɺࠓ·ͰifจதͰऑ͍ൺֱΛ͍ͬͯͨՕॴɺlintΛ੍ͤͣʹࡁΉΑ͏ʹॻ͖͑ΒΕΔ
// ࠓ·Ͱͷnull/undefinedͷνΣοΫํ๏if (value != null) {}// ࠓޙlintʹ==ΛౖΒΕΔࣄͳ͘??Ͱஔ͖͑ΒΕΔif (value ?? null) {}
Optional Chaining
foo?.bar?.baz?.qux
Optional ChainingΦϒδΣΫτ͕null/undefinedͩͬͨ߹ʹϓϩύςΟΞΫηεΛ࣮ߦͤͣundefinedΛฦ͕͢ଘࡏ͢Δͱ͖͚ͩϓϩύςΟΞΫηεΛߦ͏ࠓ·ͰࣗલͰMaybe/OptionalΫϥεΛ࣮͍ͯͨ͠έʔεΛஔ͖͑ΒΕΔ
// Null CoalescingͱΈ߹ΘͤΔͱڧྗreturn foo?.bar?.baz?.qux ?? value;// ؔݺͼग़͕͠ඞཁconst x = (...args: any): any => {}(foo?.bar?.baz ?? x)()
Top Level Await
await foo();
Top Level Awaitࠓ·ͰawaitasyncؔͰͷΈॻ͚͕ͨɺ3.8ΑΓτοϓϨϕϧͰهड़Ͱ͖ΔΑ͏ʹͳͬͨ
Recursive Type Alias
type ReadonlyDeep = {[P in keyof T]: ReadonlyDeep}
Recursive Type Alias࠶ؼతͳܕΛ୯७ͳType AliasͰදݱͰ͖ΔΑ͏ʹͳͬͨҎલinterfaceͷextends͕ඞཁͩͬͨ
Tips
const assertion
const value = 'value' as const // value: 'value'
Const assertionͷ͋ͱʹas constͱ͚ͭΔ͜ͱͰstring/number/boolean/array/objectΛϦςϥϧλΠϓͱͯ͠ఆٛ͢Δ͜ͱ͕Ͱ͖Δ※ϦςϥϧλΠϓͱ͕ͦͷ··ܕͱͯ͠ѻΘΕΔͷͦͷͨΊɺReduxͷܕఆٛΛconst assertionΛͬͯΑΓγϯϓϧʹఆٛ͢Δ͜ͱ͕Ͱ͖Δ
const fooAction = (payload: {value: string}) => {return {type: "FOO" as const,payload}}const barAction = (payload: {value: string}) => {return {type: "BAR" as const,payload}}type ActionTypes = ReturnType | ReturnType;// "FOO" | "BAR"const reducer = (state: State, action: ActionTypes) => {switch (action.type) {case "BAZ": // Error '"BAZ"' is not comparable to type '"FOO" | "BAR"'...}}
String literal type
String literal typeݸਓతʹจࣈྻશͯenum͔ΦϒδΣΫτʹೖΕ͍͕ͯͨɺTypeScriptશͯstring literal typeͱͯ͠ܕఆٛͯ͠ɺϦςϥϧϕλॻ͖͕Ұ൪γϯϓϧͳͷͰͳ͍͔ͱߟ͑ΔΑ͏ʹͳͬͨ
const foo = (type: 'foo' | 'bar' | 'baz' | 'qux') => {...}foo('foo');foo('bar');
String literal typeΘ͔Γ͘͢γϯϓϧͳͷͰɺจࣈྻenumશͯจࣈྻܕʹ͢Δͷ͕͓͢͢ΊจࣈྻఆͪΌΜͱมʹೖΕ·͠ΐ͏
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠