Slide 1

Slide 1 text

Ϡό ͍ E S L i n t / T S L i n t ϧ ʔϧ ࡞ ͬ ͪ Ό ͬ ͨ ͔ ΋ ͠ Ε ͳ ͍ 2 0 1 8 . 4 . 2 4 R o p p o n g i . j s # 2

Slide 2

Slide 2 text

P ro f i l e • ϑϩϯτΤϯυΤϯδχΞ at PERSOL • GitHub: boiyaa
 Twitter: boiyaaaaaa

Slide 3

Slide 3 text

Ͳ Μ ͳ ϧ ʔϧ ͔ return จΛېࢭͯ͠Έͨ eslint-plugin-no-return tslint-no-return ݩʑ͸ଞͷؔ਺ܕݴޠνοΫͳจ๏Λਅࣅ͔ͨͬͨ
 ˍؔ਺ͷॻ͖ํΛἧ͔͑ͨͬͨతͳಈػɻ

Slide 4

Slide 4 text

// Error function foo(bar) { const baz = bar ** 2; return baz; } // Error const foo = function (bar) { const baz = bar ** 2; return baz; }; // Error const foo = bar => { const baz = bar ** 2; return baz; }; // OK const foo = bar => bar ** 2;

Slide 5

Slide 5 text

஋Λฦؔ͢਺Λॻ࣌͘ʹ͸ɺΞϩʔؔ਺ͷ؆ܿจମ͔͠ ࢖͑ͳ͘ͳΔ͚͔ͩͱࢥ͚ͬͨͲ จ͕ॻ͚ͳ͍؆ܿจମʹΑͬͯɺ৭ʑͳॻ͖ํΛ౷ҰͰ ͖ͨΓɺ Lint ϧʔϧΛγϯϓϧʹͰ͖ͨΓ͢Δ͜ͱʹؾ ͍ͮͨɻ

Slide 6

Slide 6 text

৚݅ͷॻ͖ํΛ౷ҰͰ͖ͯɺ
 ϧʔϧΛݮΒͤͨɻ

Slide 7

Slide 7 text

const foo = bar => { if (bar == "baz") { return "qux"; } return "quux"; }; const foo = bar => { switch (bar) { case "baz": { return "qux"; } default: { return "quux"; } } }; // ! const foo = bar => (bar == "baz" ? "qux" : "quux");

Slide 8

Slide 8 text

if ΍ switch ͸ ESLint ϧʔϧଟ͍ͷͰ࢖͑ͳ͍ͳΒ͖ͬ͢ Γ͍͍ͯ͠ͱࢥ͏ɻ Ͱ΋ࡾ߲ԋࢉࢠ͸൱ఆ೿͕݁ߏ͍Δ͠ೖΕࢠ͸Ϡό͍ɻ Ramda Λ࢖ͬͯΈΔͱ͔

Slide 9

Slide 9 text

const foo = bar => (bar == "baz" ? "qux" : "quux"); // ! const foo = ifElse(equals("baz"), always("qux"), always("quux"));

Slide 10

Slide 10 text

const foo = (bar, baz) => { if (bar < baz) { return "qux"; } else if (bar > baz) { return "quux"; } return "corge"; }; // ! const foo = cond([ [R.lt(R.__, R.__), R.always("qux")], [R.gt(R.__, R.__), R.always("quux")], [T, always("corge")] ]);

Slide 11

Slide 11 text

const foo = bar => { switch (bar) { case "baz": { return "qux"; } case "quux": { return "corge"; } default: { return "grault"; } } }; // ! const foo = cond([ [equals("baz"), always("qux")], [equals("quux"), always("corge")], [T, always("grault")] ]);

Slide 12

Slide 12 text

ϧʔϓͷॻ͖ํΛ౷ҰͰ͖ͨɻ

Slide 13

Slide 13 text

const foo = bar => { const baz = []; for (let i = 0; i < bar.length; i++) { baz.push(bar[i] ** 2); } return baz; }; // ! const foo = bar => bar.map(baz => baz ** 2);

Slide 14

Slide 14 text

const foo = count => { const baz = []; for (let i = 0; i < count; i++) { baz.push(i ** 2); } return baz; }; // ! const foo = (count, baz, i) => i < count ? foo(count, [].concat(baz, [i ** 2]), i + 1) : baz;

Slide 15

Slide 15 text

for ͱ͔ while ͱ͔ॻ͚ͳ͍ͱɺ഑ྻ͸͍͍ͱͯ͠ɺ
 ؆ܿจମʴࡾ߲ԋࢉࢠͷ࠶ؼؔ਺͸ಡΈʹ͍͘ɻ ͜Ε΋ Ramda Ͱॻ͍ͯΈΔɻ

Slide 16

Slide 16 text

const foo = bar => { const baz = []; for (let i = 0; i < bar.length; i++) { baz.push(bar[i] ** 2); } return baz; }; // ! const foo = bar => bar.map(baz => baz ** 2); // ! const foo = bar => map(baz => baz ** 2, bar);

Slide 17

Slide 17 text

const foo = count => { const baz = []; for (let i = 0; i < count; i++) { baz.push(i ** 2); } return baz; }; // ! const foo = (count, baz, i) => i < count ? foo(count, [].concat(baz, [i ** 2]), i + 1) : baz; // ! const foo = count => times(i => i ** 2, count);

Slide 18

Slide 18 text

ม਺ɾఆ਺ΛఆٛͰ͖ͳ͘ͳͬͨ

Slide 19

Slide 19 text

const foo = bar => { const baz = bar ** 2; return baz + baz; }; // ! const foo = bar => bar ** 2 + bar ** 2; // ! let ࣜ෩Ξϓϩʔν const foo = bar => (baz => baz + baz)(bar ** 2);

Slide 20

Slide 20 text

const foo = bar => { const baz = bar ** 2; const qux = baz ** 2; const quux = qux ** 2; return baz + qux + quux; }; // ! let ࣜ෩Ξϓϩʔν͸Ϡό͍ const foo = bar => (baz => ((baz, qux) => ((baz, qux, quux) => baz + qux + quux)(baz, qux, qux ** 2))( baz, baz ** 2 ))(bar ** 2);

Slide 21

Slide 21 text

// ͜Μͳؔ਺Λ࡞Δ const letin = (initialValue, funcs) => funcs .reduce( (previousValue, func) => [ ...previousValue, func.apply(null, previousValue) ], initialValue ) .pop();

Slide 22

Slide 22 text

const foo = bar => { const baz = bar ** 2; const qux = baz ** 2; const quux = qux ** 2; return baz + qux + quux; }; // ! const foo = bar => letin( [bar], [ bar => bar * bar, (bar, baz) => baz * baz, (bar, baz, qux) => qux * qux, (bar, baz, qux, quux) => baz + qux + quux ] );

Slide 23

Slide 23 text

return Ҏ֎ͷจ͸͔͚ΔͷͰɺ ஋Λฦ͞ͳ͍ؔ਺ͳΒͳΜͰ΋͋Γ

Slide 24

Slide 24 text

function foo(bar) { bar.baz = "qux"; bar.quux.push("corge"); } const foo = function (callback) { callback(); }; const foo = () => { throw new Error("bar"); }; function* foo() { yield "bar"; }

Slide 25

Slide 25 text

· ͱ Ί • ESLint/TSLint ͷϧʔϧઃఆ͕γϯϓϧʹͳΔ • ͪΐͬͱίʔυॻ͖ʹ͍͘ • গͳ͍ϧʔϧͰ৭ʑͳॻ͖ํ੍͕ݶ͞ΕΔ͜ͱࣗମ͸ ͍͍͔ͳͱࢥ͍ͬͯΔ

Slide 26

Slide 26 text

Έ͍ͨͳ