Share
Embed
Transcript
130 slides
-
ߨࢣ - ໊শɿݟ༸ี ʢ@Quramy / ͘ΒΈʔ ͱݺΕΕΔ͜ͱ͕ଟ͍ʣ - ॴଐɿԣஅΤϯδχΞϦϯά෦ ASG
- ৬ྺɿϦΫϧʔτʹདྷͨͷ2020/2݄ɻ ࠃSIer -> Webܥϕϯνϟʔ2ࣾʹ͍·ͨ͠ -
QuramyͱTypeScript - 20153݄5͔ΒTSͬͯ·͢ - ࣌VSCͳ͔ͬͨͨΊɺVim͚ͷTypeScript pluginΛॻ͍ͨΓ - ࠷ۙESLint͚ͷΤσΟλ֦ுGarphQL༻ͷΤσΟλ֦ுΛ࡞ͬͨ Γ͍ͯ͠·͢ɻASTܥͷٕज़ׂ͕ͱಘҙͰ͢ -
https://github.com/microsoft/TypeScript-Website ͰTSຊՈαΠτͷ ༁׆ಈΛ͍ͯͨ࣌͠ظʢͨͩ͠࠷ۙશવܞΘͬͯͳ͍ʣ -
࣍ 1. TypeScript is Կ 2. TypeScriptʹ৮ΕΔ ※ 3. ܕͷૢ࡞
※ 4. ϥΠϒϥϦͷܕఆٛ 5. TypeScriptͱϞδϡʔϧ 6. TypeScriptͱϏϧυΤίγεςϜ -
͍ͬͺ͍͋ΔͧAltJS - AltJS͍Ζ͍Ζ - Flow Type, CoffeeScript, Dart, Reason, Hexa,
Elm, JSX (not React) , ScalaJS, ClojureScript, asm.js, GopherJS, GWT, etc… - ϒϥβͰಈ͔ͤΔݴޠجຊతʹJavaScript͚ͩͳͷͰ※1 ɺੈͷதʹ ͍ͬͺ͍Alt JS͕͋Γ·͢ - ※1 ࠷ۙWebAssembly͋Δ͚ͲɺͦΕআ֎ͨ͠ͱͯ͠ - Ұ࣌ظӍޙͷͷࢠͷ͝ͱ͘ཚཱ͍ͯ͠·͕ͨ͠ɺ࠷ۙTypeScriptʹ ܉্͕͕Γͭͭ͋Δؾ 11 -
ͦͦ͜͜ਓؾ͋Δ Developers who are developing with the language or technology
and have expressed interest in continuing to develop with it 12 https://insights.stackoverflow.com/survey/2020#technology-most-loved-dreaded-and-wanted-languages -
·ͣ৮ͬͯΈΑ͏ - TypeScript Playground ʹ͓खܰڥ͕͋Γ·͢ - ৮ͬͯΈΑ͏Playgroundɿ - Run /
LogsͰ࣮ߦΛ֬ೝ͠Α͏ - JSλϒ͔ΒτϥϯεύΠϧ͞ΕͨJavaScriptίʔυΛ֬ೝ͠Α͏ 14 -
ܕνΣοΫ͕Ͱ͖Δ - JavaScriptಈతܕݴޠ - ࣮ߦ͢Δ·ͰΘ͔Βͳ͍͜ͱ͕͍ͬͺ͍ 😇 🤔 hogeείʔϓʹఆٛ͞Εͨม ʁ 🤔
hogeobjectͰɺfooͱ͍͏ϓϩύςΟ͕ଘࡏ͍ͯ͠Δʁ 🤔 hoge.fooؔͱ࣮ͯ͠ߦͰ͖Δʁ console.log(hoge.foo()); 16 -
ܕνΣοΫ͕Ͱ͖Δ - TypeScript੩తʹܕΛ༩ͯ͠ɺhoge.foo() ͕࣮ߦͰ͖Δ͔Ͳ͏͔ ΛιʔείʔυͷϨϕϧͰνΣοΫ͠·͢ - ʮܕΤϥʔͰౖͬͯΒ͑Δʯͷͤͳ͜ͱͰ͢ - ςετ͕ޮతʹʢςετ͠ͳ͍͍ͯ͘ͱ͍͏༁Ͱͳ͍ʣ -
ಈతݴޠʹܕΛ༩͑ͯɺ੩తʹνΣοΫͰ͖ΔΑ͏ʹ͢Δ͜ͱΛ࣍త ܕʢGradual typingsʣͱ͍͍·͢ 17 -
ܕνΣοΫબΔ - TypeScript as ࣍తܕͷΑ͍ͱ͜Ζɿ - طଘͷJavaScript͚ͩͰॻ͔ΕͨιʔείʔυʹঃʑʹܕΛ͚͍͚ͯΔ - ৽نϓϩδΣΫτͰɺ࠷ॳ͔Β੩తܕݴޠͱಉ͡Α͏ʹ͏͜ͱ Ͱ͖Δ
- TypeScript as ࣍తܕͷҙɿ - ॴḨޙͷػߏɻJavaScriptͷࣗ༝ͱ૬͢ΔՕॴ͋Δ͠ɺӕͭ ͍ͯܕγεςϜ͕ὃ͞ΕΔ͜ͱ͢Β͋Γಘ·͢ 18 -
ΤσΟλαϙʔτ͕༏ल - TypeScriptͦͷͷʹҎԼͷػೳؚ͕·Ε͍ͯΔͷͰɺΤσΟλ͕շదͰ͢ - ΤϥʔνΣοΫ - ิ - ఆٛδϟϯϓ -
ࢀরՕॴͷදࣔ - ϦϑΝΫλϦϯάิॿػೳ - etc… 21 -
ΤσΟλαϙʔτ͕༏ल - ʢ༨ஊʣ - TypeScriptͷݴޠαʔϏεʢtsserverʣC#ͷΈΛݩʹɺ LSP(Language Service Protocol) ͱ͍͏ʮΤσΟλͱϓϩάϥϛϯά ݴޠؒͷΠϯλʔϑΣʔεʯ͕ੜ·Εͨ΄Ͳ
- ೦ͳ͜ͱʹTypeScriptLSP४ڌ͍ͯ͠·ͤΜ 22 -
Function parameters - ؔͷԾҾʹऍΛ༩ͯ͠Έ·͢ - 📝 PlaygroundͰԼهΛॻ͍ͯΈͯɿ function add(a: number,
b: number) { return a + b; } console.log(add(100, 100)); 29 -
Function parameters - 📝 ऍ͢ΔܕΛҎԼͷΑ͏ʹॻ͖͑ͯɺΤϥʔνΣοΫ͞ΕΔ͜ͱΛ ֬ೝͯ͠Έͯɿ function add(a: string, b:
string) { return a + b; } 30 -
ऍͰ͖Δͱ͜Ζ - ଞʹ : ܕ໊ ͰऍͰ͖Δͱ͜Ζ৭ʑ͋Γ·͢ const a: string =
"hoge"; let b: string; var c: string; function d(): string { return "hoge"; } class MyClass { e: string = ""; } 32 -
ऍͱਪͷিಥ - ऍͨ͠ܕͱਪ݁Ռ͕৯͍ҧ͏ͱɺίϯύΠϧΤϥʔʹͳΓ·͢ - 📝 ԼهͷίʔυͰΤϥʔʹͳΔ͜ͱΛ֬ೝͯ͠Έͯɿ - ى͖ͨΤϥʔΛमਖ਼͢ΔʹͲͷΑ͏ʹ͢Εྑ͍Ͱ͠ΐ͏ʁ function add(a:
number, b: number) { return a + b; } const a: string = add(100, 100); 33 -
Primitive types - Ҏ֎ʹɺจࣈྻਅِͳͲprimitive typeͱͯ͠༻ҙ͞Ε͍ͯ ·͢ const bool: boolean =
true; const num: number = 100; const str: string = "hogehoge"; const nullObj: null = null; const undefVal: undefined = undefined; 34 -
Function type - JavaScriptͷੈքͰɺؔΦϒδΣΫτͷҰछͰ͋Δ͜ͱ͔Βɺ TypeScriptʹʮؔࣗମͷܕʯ͕͋Γ·͢ - ྫɿ - Γ͕ଘࡏ͠ͳ͍ؔͷ߹ɺ=> void
ͱॻ͖·͢ (a: number, b: number) => number 35 -
Object / Array type const obj: { name: string, age:
number } = { name: "Bob", age: 20, }; const arr: number[] = [1, 2, 3]; 36 -
Type alias - typeߏจͰܕʹผ໊Λ͚ͯ࠶ར༻Ͱ͖·͢ɻ”type alias” ͱݺΕ· ͢ɻ͔ͳΓසൟʹ͍·͢ - type໊େจࣈ͔Β։࢝͢Δͷ͕ҰൠతͰ͢ type
Messages = string[]; function showMessages(msgs: Messages) { msgs.forEach(msg => console.log(msg)); } 37 -
ϛχԋश - 📝 ҎԼΛຬͨ͢ GetUser ͱ͍͏ؔܕΛॻ͍ͯΈͯ - input(=Ҿ): จࣈྻܕ -
output(=Γ): ࣍ͷߏͰఆٛ͞ΕΔΑ͏ͳUserܕ id จࣈྻ name จࣈྻ age isMarried ਅِ 38 -
Class type TodoItem = { name: string; }; interface Service
{ getTodos(): TodoItem[]; } class ConcreteService implements Service { private _todos: TodoItem[]; constructor(initialTodos: TodoItem[]) { this._todos = initialTodos; } getTodos() { return this._todos; } } 40 -
JavaScriptͷClassʹແ͍ػೳ - ϑΟʔϧυɾϝιουʹՄࢹੑ͕ઃఆͰ͖Δ - private / protected / public -
※ TypeScriptʹ͓͚ΔprivateߏจSoft PrivateɻͦͷؾʹͳΕΞΫ ηεͰ͖Δ - நΫϥε / நϝιουΛఆٛͰ͖Δ - InterfaceΛ࣮Ͱ͖Δ 41 -
any - ʮͯ͢ͷܕͱͯ͠ৼΔ͏͜ͱ͕Ͱ͖ΔʯͨΊɺܕʹؔ͢Δίϯύ ΠϧΤϥʔ͕ͯ͢ࢭ͞Ε·͢ - anyTypeScriptʹ͓͚ΔඞཁѱͰ͢ɻ͏ͱ͖ࡑѱײͰ৺Λগ͠௧ ΊΔΑ͏ʹ͠·͠ΐ͏ const fn: any
= () => 100; const hoge: number = fn; 43 -
anyΛ͏ͷ͕ଥͳέʔε - anyੑ࣭Λཧղͯ͠͏ʹศརͳػೳͰ͢ - طଘͷJavaScriptϓϩδΣΫτTypeScriptΛಋೖ͢ΔࡍʹɺͱΓ͋͑ ͣܕऍΛͯ͠͠·͍͍ͨʢ࣮ίʔυΛഁյͨ͘͠ͳ͍ʣ - ෳࡶͳؔͷ෦ͰҰ࣌తʹ͏έʔεɻؔͷςετΛ͔ͬ͠Γͱ ߦ͍ͬͯͯɺ͔ͭҾͱΓͷܕ͕ͪΌΜͱॻ͍ͯ͋Εͳ͍ -
͍ͣΕʹͤΑʮanyͷӨڹہॴతʹԡ͓͑ͯ͘͞ʯ͕TypeScriptͱ͏· ͖͘߹͍ͬͯ͘ίπͰ͢ 44 -
ೖՄೳͱԿ͔ - assignableͷྫ: - showMessageؔɺจࣈྻܕͰ͋Δmessageͱ͍͏ϑΟʔϧυΛ ࣋ͬͨܕͰ͋ΕɺԿͰೖՄೳ type SomeType = {
message: string; }; function showMessage(obj: SomeType) { console.log(obj.message); } showMessage({ message: “Hello!" }); 46 -
Interface v.s. Type alias - ϑΟʔϧυϝιουΛ࣋ͭΦϒδΣΫτͷܕΛఆٛͰ͖Δͱ͍͏ҙຯ Ͱɺtype aliasͱinterfaceʹػೳͷॏෳ͕͋Γ·͢ interface IHoge
{ message: string; onChangeMessage(cb: (msg: string) => void): void; } type HogeType = { message: string; onChangeMessage(cb: (msg: string) => void): void; }; let hoge1: IHoge; let hoge2: HogeType; /* IHogeͱHogeTypeํʹassignable */ hoge1 = hoge2; hoge2 = hoge1; 49 -
Interface v.s. Type alias - 📝 લϖʔδͷ IHoge interface ͱ
HogeType ʹ͍ͭͯɺPlayground্Ͱ ͷҧ͍Λ୳ͯ͠Έͯ - 📝 લϖʔδͷྫʹɺԼهΛهͨ͠ͱ͖ʹͲ͏ͳΔ͔֬ೝͯ͠Έͯ interface IHoge { errorCode: number; } 50 -
ʢิʣඪ४ APIͱTypeScript - TypeScript ࣗମʹඪ४ APIͷܕ͕όϯυϧ͞Ε͍ͯ·͢ - JavaScriptʢECMAScriptʣͷඪ४ API -
DOM APIfetchͳͲɺϒϥβʹඪ४ͰඋΘ͍ͬͯΔAPI 54 -
Type error - JavaScriptͷϓϩάϥϜͰͬͱසൟʹੜ͡Δόάɺnull ·ͨະ ఆٛͷมʹରͯ͠ɺ͕ଘࡏ͢ΔલఏͰΞΫηεͯ͠͠·͏έʔεͰ ͢ - ʢ༨ஊʣTony Hoare
ᐌ͘ʮNullࢀর࠷େͷޡΓͩͬͨɻίϯύΠϧ Ͱͯ͢νΣοΫͰ͖ΔΑ͏ʹ͔ͨͬͨ͠ʯ - https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony- Hoare/ 58 Uncaught TypeError: Cannot read property ‘hoge' of undefined -
Optional - ΦϓγϣϯͷstrictNullCheck͕trueͷ߹ɺOptionalͳΛ͍͖ͳΓૢ ࡞͠Α͏ͱ͢ΔͱTypeScript͕ίϯύΠϧΤϥʔʹͯ͘͠Ε·͢ ʢίϯύΠϧΤϥʔ͝๙ඒͩͱࢥ͍·͠ΐ͏ʣ function fn(args: { message?: string})
{ // ࣄલʹargs.messageͷଘࡏΛνΣοΫ͢Δඞཁ͕͋Δ if (!args.message) return ""; return args.message.toLowerCase(); } fn({}); // messageΛলུՄೳ 60 -
ͦͷଞͷOptionalදݱ - ϓϩύςΟ໊ޙͷ ? Ҏ֎ʹOptionalมΛදݱ͢Δํ๏͕͋Γ·͢ - ※ ύΠϓه߸ͷҙຯޙड़͠·͢ // ؔͷoptionalҾ
function hoge(a: number, b?: number) { } // null undefined ͱͷUnion type X = string | undefined; type Y = string | null; -
strictNullCheck ʹ͍ͭͯ - strictNullChecksɺࢀর͍ͯ͠Δͷܕʹnull ·ͨ undefined͕ೖ Մೳͳ߹ʹɺͦͷͷૢ࡞Λ੍ݶ͢ΔػೳͰ͢ - TypeScriptͷσϑΥϧτઃఆͰɺstrictNullCheckONͰ͢ -
جຊతʹ༗ޮʹ͓͍ͯͨ͠ํ͕ྑ͍ػೳͰ͕͢ɺطଘͷJavaScriptϓ ϩδΣΫτʹޙͰTypeScriptΛಋೖ͢Δ߹ɺҰ୴offʹ͢ΔͷΞ ϦͰ͢ 62 -
Modifiers - ܕఆٛͰͷ ? optional modifierͱݺΕ·͢ - modifierʹoptionalҎ֎ͷmodifierͱͯ͠ɺreadonlyͱ͍͏ͷ͋Γ· ͢ʢʮSoftͳʯ࣮Ͱ͋ΔͨΊɺτϥϯεύΠϧޙͷjs͔Βॻ͖͑Մೳʣ type
Hoge = { m1: string; m2?: string; readonly m3: string; readonly m4?: string; }; 63 -
Literal type - /จࣈྻ/ਅِܕɺͦΕͧΕͷͦͷͷΛܕͱͯ͠͏͜ͱ͕ Ͱ͖·͢ɻ͜ΕΛLiteral Typeͱݺͼ·͢ type SomeString = "some
string"; type SomeNumber = 1; type True = true; function fn(str: SomeString) { return str.trim(); } fn("some string"); // OK fn("other string"): // Error 64 -
Union type - ෳͷܕΛύΠϓه߸ʢ | ʣͰ۠Δ͜ͱͰɺUnion Typeʢܕ, ڞ༻ମ ܕͱʣΛએݴ͠·͢ -
String Literal Typeͱซ༻͢ΔͱɺྻڍܕͷΑ͏ʹѻ͏͜ͱͰ͖·͢ ʢTypeScriptʹenumߏจ͕༻ҙ͞Ε͍ͯ·͕͢ɺ͋·Γར༻͞Ε·ͤΜʣ type NumOrStr = string | number; type MaybeStr = string | null | undefined; type Colors = "red" | "blue" | "green" | "yellow"; 65 -
ܕͷߜΓࠐΈ - Union TypeɺifจswitchจͰΛνΣοΫ͍ͯ͘͜͠ͱͰɺΑΓৄࡉͳ ܕߜΓࠐΉ͜ͱ͕Ͱ͖·͢ɻ͜ΕΛType NarrowingͱΑͼ·͢ - strictNullCheckͰઆ໌ͨ͠ifจʹΑΔߜΓࠐΈType NarrowingͷҰछͰ͢ function
fn(input: string | number) { console.log(input.toString()); if (typeof input === "number") { console.log(200 * input); } else { console.log(input.trim()); } } 66 -
Type Narrowingͷछྨ - ͍͔ͭ͘ͷߏจ͕Type Narrowingͱͯ͠ར༻Ͱ͖·͢ɿ - typeof x === “string”,
x instanceof HogeClass - Literal typeʹ͓͚Δಉ֬ೝʢ if (x === “some message”) ʣ - obj.x obj[“x”] x in objͳͲͷଘࡏ֬ೝ - User Defined Type Guard function: function fn(x: any): x is { msg: string } { return !!x.msg && typeof x.msg === "string"; } 67 -
ϛχԋश̍ - 📝 ҎԼͷؔ type ʹԠͯ͡ɺpayload ͷܕ͕ҟͳΓ·͢ɻ ίϯύΠϧ͕௨ΔΑ͏ʹɺAction ͷܕΛߟ͑ͯΈͯ 68
function reduce(state = [100], action: Action) { switch (action.type) { case “CONCAT": // payload: number[] return state.concat(action.payload); case “REMOVE": // payload: number return state.filter(val => val !== action.payload); default: return state; } }; -
ϛχԋश̎ - 📝 ࣍ͷίʔυԼઢ෦ͰίϯύΠϧΤϥʔͱ͞Εͯ͠·͍·͢ɻԿ ނͰ͠ΐ͏͔ʁ const prices = [1000, 500];
type Item = { price?: number; }; function fn(item: Item): boolean { if (item.price == null) return false; return prices.some( p => item.price > p, ); } 69 -
Ωϟετ - จࣈྻͷLiteral TypestringܕʹೖՄೳͰ͕͢ɺ stringܕจࣈྻͷLiteral TypeʹೖͰ͖·ͤΜ - ʮೖՄೳʯɺSub Typeʢ۩ʣˠ Super
Typeʢநͳܕʣͷํ ʹݶఆ͞ΕΔ͔ΒͰ͢ type SomeString = "some string"; const x: SomeString = "some string"; const y: string = x; const z: SomeString = y; Super type Sub type type SomeString string -
Ωϟετ - ͜ͷΑ͏ͳ߹ɺมͷޙΖʹ as ܕ໊ Λ༩͢Δ͜ͱͰܕΛมͰ͖ ·͢ʢਖ਼ࣜʹ ΩϟετͰͳ͘ɺType Assertion ͱݺΕΔػೳʣ
Super type Sub type type SomeString string type SomeString = "some string"; const x: SomeString = "some string"; const y: string = x; const z = y as SomeString; -
asͷ੍ - asͰมͰ͖ΔͷɺSuper Type → Sub Type ͷ͕݅ຬͨ͞ΕΔͱ͖ ͷΈͰ͢ -
e.g. numberܕstringܕʹมͰ͖·ͤΜ Super type Sub type type SomeString string -
Narrowing v.s. Assertion - Type Narrowing Type Assertion ʮมͷܕΛΑΓڱ͍ܕʹ͢Δʯ
ͱ͍͏ޮՌΛಘΔ͜ͱ͕Ͱ͖·͢ - Type Narrowing: JavaScriptͷ੍ޚߏจʹԊͬͨܗࣜͰͷࣗવͳܕͷߜ ΓࠐΈ - Type Assertion: ։ൃऀʹΑΔ(֎෦ͷࣝΛར༻ͨ͠)ڧ੍తͳߜΓ ࠐΈ -
Intersection Type - Union TypeܕͱܕͷͰ͕͢ɺܕͱܕͷੵଘࡏ͠·͢ - ه߸ & ͰෳͷܕΛ࿈݁͢ΔͱɺIntersection TypeʹͳΓ·͢
- type A & B ɺʮAʹBʹassignableʯͳܕͰ͢ 74 -
Bottom Type - neverܕʮͯ͢ͷܕͷSub Typeʯͱͯ͠ѻΘΕ·͢ɻͯ͢ͷܕ͕ neverೖͰ͖·͕͢ɺneverneverҎ֎ͷͯ͢ͷܕʹೖͰ͖· ͤΜ - Type Narrowingͷ݁Ռɺneverܕʹਪ͞ΕΔϒϩοΫʮ౸ୡෆՄ
ೳʯͱ͍͏ҙຯʹͳΓ·͢ function fn(x: number) { if (typeof x === "string") { return x.trim(); } return x; } 75 -
Composition never - Լهͷܕ A ɺB ͦΕͧΕͲΜͳܕͰ͠ΐ͏ʁ (XԿ͔దͳܕͱ͠·͢ʣ type A
= never | X; type B = never & X; 77 -
Generics type List<T> = T[]; function getLength<T>(list: List<T>) { list.length;
} interface IFoo<T> { list: ReadonlyArray<T>; } class Foo<T> implements IFoo<T> { constructor(public readonly list: T[]){ } get size() { return getLength(this.list); } } const foo = new Foo<string>([""]); 80 -
Generics // Γ͕Promise<{ id: number; name: string; }> function getTodo()
{ return Promise.resolve({ id: 100, name: "hoge", }); } const index = new Map<number, string>(); index.set(1, "hoge"); index.has(1); const colors: ReadonlyArray<string> = [ "red", "green", "blue", ]; colors.sort(); // ഁյૢ࡞ېࢭ -
ԋशͷલʹ - ։ൃڥ͕͍ͬͯΔ͜ͱΛ֬ೝ͠·͠ΐ͏ - ҎԼͷίϚϯυར༻ՄೳͰ͔͢ʁ - git - node --version
- ΤσΟλ: - ͩ͜ΘΓ͕ແ͚ΕɺVisual Studio Code Λ͍ͬͯͩ͘͞ 84 -
Advanced type - ࠓׂѪ͠·͕͢ɺܕγεςϜʹΑΓߴͳػೳ༻ҙ͞Ε͍ͯ· ͢ - Mapped Type: objectܕͷkeyΛ࠶ར༻ͯ͠ผͷܕΛ࡞Δ -
Conditional Type: ೖՄೳੑͰܕΛύλʔϯϚον - Type Inference in Conditional Type: ύλʔϯϚονͨ͠ܕͷ࠶ར༻ - Template Literal Type: จࣈྻϦςϥϧͷܕԋࢉ 88 -
Advanced type interface Observable<T> { subscribe(cb: (v: T) => void):
void; } type Unboxing<T> = T extends Observable<infer S> ? S : never; declare function combineLatest<U extends Observable<any>[]>( ...args: U ): Observable< { [P in keyof U]: Unboxing<U[P]>; } >; declare const s1: Observable<string>; declare const s2: Observable<number>; declare const s3: Observable<boolean>; combineLatest(s1, s2, s3).subscribe(([v1, v2, v3]) => { }); -
1. NPM ύοέʔδʹܕఆ͕ٛಉ ࠝ͞Ε͍ͯΔ - npm install (ϥΠϒϥϦ໊) Λ࣮ߦ͢Δ͚ͩͰܕఆ͕ٛར༻ՄೳʹͳΓ· ͢
- ͜ͷखͷͭɺϥΠϒϥϦͷpackage.jsonʹ “types”: “index.d.ts” ͱ ͍ͬͨهड़͕͋Γ·͢ 97 -
ܕఆٛϑΝΠϧͷҙ - ఏڙ͞Εͨܕఆ͕ٛຊମͷAPIΛཏ͍ͯ͠ͳ͍͜ͱɺ··͋Γ·͢ - e.g. ಛఆͷؔͷܕఆ͕ٛͬͦ͝Γൈ͚ͯΔ / anyͩΒ͚ / etc…
- ͜ͷखͷέʔεʹ໘ͨ͠ΒɺܕఆٛΛमਖ਼͢ΔPRΛग़͠·͠ΐ͏ 102 -
ES2015 Ϟδϡʔϧ // calc.js // ϞδϡʔϧΛར༻͢Δଆ import { add }
from “./add.js”; console.log(add(1, 2)); // add.js // ϞδϡʔϧΛఆٛ͢Δଆ export function add(a, b) { return a + b; } -
CommonJSͷϞδϡʔϧ // calc.js // ϞδϡʔϧΛར༻͢Δଆ const add = require("./add"); console.log(add(1,
2)); // add.js // ϞδϡʔϧΛఆٛ͢Δଆ function add(a, b) { return a + b; } module.exports = add; -
Module loader - ES2015 ϞδϡʔϧͰ͋ΕɺಠࣗܗࣜͰ͋ΕɺϞδϡʔϧԽ͞Εͨ JavaScriptΛऔΓࠐΉΈ͕ඞཁͰ͢ - <script type=“module”>λάɺNode.jsͷrequireػߏͳͲ -
ϞδϡʔϧΛಡΈࠐΉΈʮϞδϡʔϧϩʔμʔʯͱݺΕ·͢ 108 -
--module - ར༻ՄೳͳϞδϡʔϧϩʔμʔɺjsΛ࣮ߦ͢ΔڥʹΑͬͯҟͳͬͯ͠ ·͏ͷ͕ݱঢ়Ͱ͢ - TypeScriptɺ͜ΕΒͷ࣮ߦڥࠩҟΛٵऩ͢ΔͨΊʹҎԼͷࢥͰ࡞ ΒΕ͍ͯ·͢ - ιʔείʔυES2015ελΠϧͰهड़ -
tsconfig.jsonͷmoduleઃఆͰɺϥϯλΠϜͰར༻͢ΔϞδϡʔϧϩʔ μʔΛઃఆɻτϥϯεύΠϧͰม͞ΕΔ 109 -
--module - moduleઃఆͷ͍͚ྫ - Node.jsͰಈ࡞ͤ͞ΔͨΊʹ module: “commonjs” Λઃఆ (※ ࠓޙ
“nodenext” ͳͲͷઃఆར༻ՄೳʹͳΔݟࠐΈ ) - ϒϥβͷ<script type=“module”>ػೳΛͬͯಡΈࠐΉͨΊʹɺ module: “esnext” Λઃఆ 110 -
ʢ༨ஊʣଞͷ--moduleୡ - --module ʹ “amd” / “umd” / “system” ͷબՄೳͰ͢ɻ…͕໓ଟ
ʹ͏͜ͱͳ͍Ͱ͢ - ڵຯ͕͋ͬͨΒɺ“RequireJS” ͱ͔ “SystemJS” ͰௐͯΈΔͱྑ͍ͱࢥ ͍·͢ 111 -
Ϗϧυπʔϧͷཚཱ - Ϟδϡʔϧϩʔμʔ - CommonJS (Node.js) ελΠϧ, RequireJSελΠϧ, etc… -
ϏϧυγεςϜ - Grant, Gulp, etc… - ѹॖʢಡԽʣπʔϧ - YUI Compressor, ClosureCompiler, UglifyJS, etc… 115 -
Ϗϧυπʔϧͷཚཱ - Ϟδϡʔϧϩʔμʔ - CommonJS (Node.js) ελΠϧ, RequireJSελΠϧ, etc… -
ϏϧυγεςϜ - Grant, Gulp, etc… - ѹॖʢಡԽʣπʔϧ - YUI Compressor, ClosureCompiler, UglifyJS, etc… 116 ͱʹ͔͘৭ʑ͋ͬͨʂ -
Module bundler - αʔόʔαΠυJavaScriptͰ͋ΔNode.jsͷීٴͱɺ Node.jsʹ͓͚ΔϞδϡʔϧػߏʹΠϯεύΠΞ͞Ε ͯɺbrowserifyͱ͍͏πʔϧ͕ҰੈΛ෩ᴆ͠·ͨ͠ - ιʔείʔυதͷ require(‘…’) Λ੩తղੳͰ୳ࡧ͠ɺ
require͞Ε͍ͯΔґଘscriptΛ݁߹͢Δ͜ͱͰɺ୯Ұ ͷ.jsϑΝΠϧΛੜ͠·͢ 117 -
webpack - webpack ۙ͘ΘΕ͍ͯΔϞδϡʔϧόϯυϥͰ͢ - https://webpack.js.org/ - JavaScript / AltJS͚ͩͰͳ͘ɺը૾CSSͳͲ༷ʑͳϑΝΠ
ϧΛΞηοτͱͯ͠όϯυϧϑΝΠϧʹऔΓࠐΊ·͢ 119 -
webpack - webpackͰͰ͖Δ͜ͱʢҰ෦ൈਮʣ: - AltJSΛτϥϯεύΠϧͭͭ͠ɺόϯυϧΛ࡞͢Δ - όϯυϧʹରԠ͢ΔιʔεϚοϓϑΝΠϧΛ࡞͢Δ - ಡԽΛࢪͯ͠࠷ऴతͳϑΝΠϧαΠζΛখ͘͢͞Δ -
Node.jsͷAPIΛҰ෦ϒϥβ͚ʹఏڙ͢Δ 120 -
࠷ۙͷࣄ - ۙͰɺECMAScriptͷimport/exportߏจϒϥβͷ<script type=“module”>ͱ͍ͬͨඪ४Խ͕ਐΈɺόϯυϥʹཔΒͳ͘ͱϞ δϡʔϧ͕ར༻ՄೳͰ͢ - ͱ͍͑ɺimport ͷ࿈͕ਂ͘ͳΔͱɺϒϥβ͕࠷ޙͷϞδϡʔϧʹ ౸ୡ͢Δ·Ͱʹ͕͔͔࣌ؒͬͯ͠·͍·͢※1 ɻ͜ͷҙຯͰɺϑΝΠϧΛ
·ͱΊΔϞδϡʔϧόϯυϥඞཁͱ͞Ε͚ͭͮΔͰ͠ΐ͏ - ※1 https://docs.google.com/document/d/1ds9EEkcDGnt-iR8SAN-_7nsOfw7gsMfhZjzZ_QAIyjM/ mobilebasic 121 -
tscࣗମͷศརػೳ - TypeScriptຊମʹଐ͍ͯ͠Δ tsc ͱ͍͏πʔϧࣗମʹศརػೳ͕උ Θ͍ͬͯ·͢ - --noEmit : .jsϑΝΠϧͷग़ྗΛߦΘͳͣʹɺܕνΣοΫͷΈΛ࣮ߦ
͢ΔΦϓγϣϯ. CIʹΈࠐΉͱศར - --noUnusedLocals, --noUnusedParameters: ར༻͞Ε͍ͯͳ͍มΛ ݕͯ͠Τϥʔʹ͢ΔΦϓγϣϯ. ͳίʔυͷݮʹͳΔ - ͦͷଞʹɺtscʹ༷ʑͳΦϓγϣϯ͕༻ҙ͞Ε͍ͯ·͢ɻެࣜυΩϡ ϝϯτΛݟͯΈΔͱΑ͍Ͱ͠ΐ͏ -
ESLint - ESLint ASTʢநߏจʣΛ༻͍ͨίʔυͷνΣοΫπʔϧͰ͢ɻې ࢭ͍ͨ͠ίʔυύλʔϯΛϧʔϧͱͯ͠ొͯ͠ར༻͠·͢ - ϧʔϧͷྫ: - consoleΛΘͳ͍͜ͱ -
࠶ೖ͠ͳ͍มʹletͰͳ͘constΛ༻͍Δ͜ͱ - TypeScriptͱESLintΛซ༻͢Δ߹ɺhttps://github.com/typescript- eslint/typescript-eslint Λ͍·͢ -
Prettier - PrettierιʔείʔυΛػցతʹϑΥʔϚοτ͢ΔͨΊͷπʔϧͰ͢ - ԼهͷΑ͏ͳෆໟͳٞʹࠨӈ͞Εͳ͍ͨΊʹɺίϛοτ࣌ʹίʔυ ΛࣗಈͰϑΥʔϚοτ͓ͯ͘͠श׳Λ͚͓ͭͯ͘ͷྑ͍͜ͱͰ͢ - ʮจࣈྻϦςϥϧγϯάϧΫΥʔτ or μϒϧΫΥʔτʯ
- ʮηϛίϩϯΛจͷඌʹ͚ͭΔ͖͔ʯ - Prettierඪ४ͰTypeScriptʹରԠ͍ͯ͠·͢ -
ࣗಈੜ - ԋश1ͱԋश2ͰݟͨΑ͏ʹɺ֎෦ͱͷ௨৴͕ൃੜ͢ΔՕॴany / unknown ʹͳΓ͕ͪͰ͢ - ௨৴ϓϩτίϧʹ߹ΘͤͯɺIDL͔ΒTypeScriptͷܕΛੜ͢Δπʔϧ ଟଘࡏ͠·͢ -
e.g. OpenAPI(Swagger), GraphQL, TypeORM, etc… -
͓ΘΓʹ - ࠓԼهͳͲΛத৺ʹֶΜͰ͖·ͨ͠ - TypeScriptͷجຊจ๏ - طଘͷJavaScriptίʔυʹܕΛಋೖ͢Δํ๏ - ܕͷநԽ <->
۩ମԽͱɺͦΕʹԠͨ͡ॲཧ੍ޚํ๏ - ࣌ؒͷ߹্ɺ৮Ε͍ͯͳ͍τϐοΫ·ͩࢁ͋Γ·͢ɻؾʹͳΔ ςʔϚ͕͋ͬͨΒɺੋඇࣗͰௐɺʢՄೳͰ͋ΕʣखΛಈ͔ͯ͠Έ ͍ͯͩ͘͞