130

TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

Embed Size (px)

Citation preview

Page 2: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• .

• .

• http://ahnheejong.name/

• github, twitter @heejongahn

Page 3: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기
Page 4: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• ?

Page 5: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• ?

• , ?

Page 6: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• ?

• , ?

• [ ] ?

Page 7: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• ?

• , ?

• [ ] ?

• ?

Page 8: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• ?

• , ?

• [ ] ?

• ?

• ?

Page 9: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• ?

• , ?

• [ ] ?

• ?

• ?

• ?

Page 10: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기
Page 11: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

(PR)

Page 12: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

(PR)

💩

💩

💩

💩

💩💩

💩

💩

💩

💩

💩

💩

Page 13: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

PR

Page 14: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

PR

Page 15: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

PR

!

Page 16: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

http://earlbarr.com/publications/typestudy.pdf

Page 17: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• ICSE’17 .

http://earlbarr.com/publications/typestudy.pdf

Page 18: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• ICSE’17 .

• .

http://earlbarr.com/publications/typestudy.pdf

Page 19: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• ICSE’17 .

• .

• “Github open issue

?”http://earlbarr.com/publications/typestudy.pdf

Page 20: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

, .

Page 21: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

“…using Flow or TypeScript could have prevented 15% of the public bugs for public projects on GitHub.”

Page 22: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

“ . 10% , . , . That’s

shocking. If you could make a change to the way we do development that would reduce the number of bugs being checked in by 10% or more overnight, that’s a no-brainer. Unless it doubles development time or something, we’d do it.”

Page 23: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

“ . 10% , . , . That’s

shocking. If you could make a change to the way we do development that would reduce the number of bugs being checked in by 10% or more overnight, that’s a no-brainer. Unless it doubles development time or something, we’d do it.”

Page 24: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

“ . 10% , . , . That’s

shocking. If you could make a change to the way we do development that would reduce the number of bugs being checked in by 10% or more overnight, that’s a no-brainer. Unless it doubles development time or something, we’d do it.”

( TypeScript MS )

Page 25: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

https://www.youtube.com/watch?v=KQevsm64wPY

Page 26: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• .

Page 27: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• .

• .

Page 28: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• .

• .

• .

Page 29: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• “ .”

• + IDE +

• , .

Page 30: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기
Page 31: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기
Page 32: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

https://www.typescriptlang.org/ https://flow.org/

Page 33: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

TypeScript Flow

Microsoft Facebook

2012.10.01 2014. 11. 19

Hyperconnect, Reddit, Tumblr, Slack, VS Code, Angular, …

(http://www.typescriptlang.org/community/friends.html)

React, Vue, …

Page 34: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기
Page 35: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기
Page 36: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기
Page 37: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기
Page 38: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• TypeScript Flow .

Page 39: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• TypeScript Flow .

• , .

Page 40: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• TypeScript Flow .

• , .

• 😇

Page 41: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• TypeScript Flow .

• , .

• 😇

• 👆 , .

Page 42: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• TypeScript Flow .

• , .

• 😇

• 👆 , .

• .

Page 43: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

😥

Page 44: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기
Page 45: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• IDE

Page 46: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

… because JavaScript was not designed around a type system, Flow sometimes has to make a tradeoff. When this happens Flow tends to favor soundness over completeness, ensuring that code doesn’t have any bugs. (https://flow.org/en/docs/lang/types-and-expressions/#soundness-and-completeness-a-classtoc-idtoc-soundness-and-completeness-hreftoc-soundness-and-completenessa)

Non-Goals: [...] Apply a sound or "provably correct" type system. Instead, strike a balance between correctness and productivity. (https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals)

Page 47: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

Non-Goals: [...] Apply a sound or "provably correct" type system. Instead, strike a balance between correctness and productivity. (https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals)

“ ” .

.

Page 48: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

… because JavaScript was not designed around a type system, Flow sometimes has to make a tradeoff. When this happens Flow tends to favor soundness over completeness, ensuring that code doesn’t have any bugs. (https://flow.org/en/docs/lang/types-and-expressions/#soundness-and-completeness-a-classtoc-idtoc-soundness-and-completeness-hreftoc-soundness-and-completenessa)

.

Page 49: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

… because JavaScript was not designed around a type system, Flow sometimes has to make a tradeoff. When this happens Flow tends to favor soundness over completeness, ensuring that code doesn’t have any bugs. (https://flow.org/en/docs/lang/types-and-expressions/#soundness-and-completeness-a-classtoc-idtoc-soundness-and-completeness-hreftoc-soundness-and-completenessa)

Non-Goals: [...] Apply a sound or "provably correct" type system. Instead, strike a balance between correctness and productivity. (https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals)

Page 50: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기
Page 51: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기
Page 52: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• alert ?

Page 53: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• alert ?

Page 54: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• alert ?

• !

Page 55: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• alert arg

Page 56: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• alert arg

• if

Page 57: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• alert arg

• if

• ‘ ’

Page 58: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• Flow (soundness)

Page 59: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• Flow (soundness)

Page 60: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• Flow (soundness)

• const

Page 61: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• Flow (soundness)

• const

• ‘ ’

Page 62: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• Flow (soundness)

• const

• ‘ ’

Page 63: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

[flow] number (This type is incompatible with an implicitly-returned undefined.)

[ts] Type '"JavaScript"' is not comparable to type '"TypeScript" | "Flow"'.

Page 64: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• IDE

Page 65: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

https://octoverse.github.com/

https://code.visualstudio.com/

Page 66: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기
Page 67: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• TypeScript

• TS ?

Page 68: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• , Go To Definition IDE

Page 70: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• , Go To Definition IDE

• ( , ) (link)

• JSDoc

Page 71: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• TypeScript 2.5~

• JSDoc

• HTML <script>

• Zero configuration needed

• Flow https://twitter.com/disjukr/status/924216888703426560

Page 74: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• IDE

Page 75: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• https://eng.lyft.com/typescript-at-lyft-64f0702346ea

Page 76: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• https://eng.lyft.com/typescript-at-lyft-64f0702346ea

• lyft TypeScript

Page 77: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• https://eng.lyft.com/typescript-at-lyft-64f0702346ea

• lyft TypeScript

• (2017 9 28 )

• .

Page 78: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

# of TypeScript Flow

StackOverflow

Github (Open/Closed)

Github PR(Open/Closed)

npm

( + )

Page 79: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

# of TypeScript Flow

StackOverflow ~ 38,000 ~ 900

Github (Open/Closed)

Github PR(Open/Closed)

npm

( + )

Page 80: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

# of TypeScript Flow

StackOverflow ~ 38,000 ~ 900

Github (Open/Closed) ~2,400 / ~11,200 ~1,500 / ~2,200

Github PR(Open/Closed)

npm

( + )

Page 81: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

# of TypeScript Flow

StackOverflow ~ 38,000 ~ 900

Github (Open/Closed) ~2,400 / ~11,200 ~1,500 / ~2,200

Github PR(Open/Closed) ~100 / ~5,000 ~60 / ~1,200

npm

( + )

Page 82: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

# of TypeScript Flow

StackOverflow ~ 38,000 ~ 900

Github (Open/Closed) ~2,400 / ~11,200 ~1,500 / ~2,200

Github PR(Open/Closed) ~100 / ~5,000 ~60 / ~1,200

npm ~7.2 million ~2.9 million

( + )

Page 83: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

# of TypeScript Flow

StackOverflow ~ 38,000 ~ 900

Github (Open/Closed) ~2,400 / ~11,200 ~1,500 / ~2,200

Github PR(Open/Closed) ~100 / ~5,000 ~60 / ~1,200

npm ~7.2 million ~2.9 million

( + ) ~3,700 + 250k ~340 + 43k

Page 84: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

# of TypeScript Flow

StackOverflow ~ 38,000 ~ 900

Github (Open/Closed) ~2,400 / ~11,200 ~1,500 / ~2,200

Github PR(Open/Closed) ~100 / ~5,000 ~60 / ~1,200

npm ~7.2 million ~2.9 million

( + ) ~3,700 + 250k ~340 + 43k

https://octoverse.github.com/

Page 85: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

# of TypeScript Flow

StackOverflow ~ 38,000 ~ 900

Github (Open/Closed) ~2,400 / ~11,200 ~1,500 / ~2,200

Github PR(Open/Closed) ~100 / ~5,000 ~60 / ~1,200

npm ~7.2 million ~2.9 million

( + ) ~3,700 + 250k ~340 + 43k

Page 86: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기
Page 87: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• …

• LoC Flow TypeScript .

• .

• .

Page 88: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기
Page 89: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

“Love for TypeScript” (https://github.com/Microsoft/TypeScript/issues/10011)

Page 90: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기
Page 91: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• Plain JavaScript

• Flow

Page 92: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• npm install -g typescript

• my-cool-lib

• npm install my-cool-lib @types/my-cool-lib

Page 93: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• , , , / , , …

• https://www.typescriptlang.org/docs/handbook/tsconfig-json.html

Page 94: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• , , / , , …

Page 95: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• —allowSyntheticalDefaultImport

• —strict = —noImplicitAny + —noImplicitThis + —alwaysStrict + —strictNullCheck + —strictFunctionType

• —lib, —target

• .

• https://www.typescriptlang.org/docs/handbook/compiler-options.html

Page 96: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• MS

• ts-loader(https://github.com/TypeStrong/ts-loader)

• awesome-typescript-loader(https://github.com/s-panferov/awesome-typescript-loader)

• awesome-typescript-loader ( )

Page 97: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• https://stackoverflow.com/questions/tagged/typescript

https://www.typescriptlang.org/samples/index.html

https://github.com/Microsoft/TypeScriptSamples/

https://github.com/Microsoft/TypeScript/wiki

Page 99: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• .

Page 100: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• .

• .

Page 101: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• .

• .

• .

Page 102: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• myScript.js -> myScript.ts

• myComponent.jsx -> myScript.tsx

Page 103: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• JS TS

• ( ) or

• TS JS

• 1.8~: —allowJs

• 2.3~: —checkJs JS – JSDoc https://github.com/Microsoft/TypeScript/wiki/Type-Checking-JavaScript-Files

Page 104: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

Page 105: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• /

https://commons.wikimedia.org/wiki/File:Community_Immunity.jpg

Page 106: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• + /

• +

Page 107: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• flow-bin -> tsc

• babel-preset-flow

Page 108: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• • Flow: ES6

(import type { MyType } import { type MyType } ) • TS: ES6 (import { MyType })

Page 109: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• • Flow: type Animal = { name: string } • TS: interface Animal { name: string; }

• • Flow: type Dog = Animal & { bark: () => void } • TS: interface Dog extends Animal { bark: () => void; }

Page 110: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기
Page 111: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기
Page 112: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• : TS

Page 113: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• : TS

• TS “ … ”

Page 114: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• : TS

• TS “ … ”

• ! !

Page 115: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• JS(babel-loader) + TS(awesome-ts-loader)

• Flow + —allowJS

• `in`

Page 116: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• TS JS TS babel-loader

Page 117: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• TS JS TS babel-loader

• babel-transform-runtime

Page 118: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• TS JS TS babel-loader

• babel-transform-runtime

• TS JS Map, Set

Page 119: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• TS JS TS babel-loader

• babel-transform-runtime

• TS JS Map, Set

• Global State

• babel

Page 120: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• —allowJs Flow JS

• error TS8010: 'types' can only be used in a .ts file.

Page 121: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• https://github.com/flowtype/flow-remove-types

• flow

• … ( )

Page 122: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• https://github.com/Microsoft/TypeScript/issues/10485

• Workaround 1-> Disjoint Union

Page 123: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• Workaround 2-> hasKey ( @pelotom)

• optional X

Page 124: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기
Page 125: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• ?

• , ?

• TypeScript ?

• ?

• ?

• ?

Page 126: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• , .

• , TypeScript .

• , .

• Webpack .

• .

• , . !

Page 127: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

. .

• , .

• , TypeScript .

• , .

• Webpack .

• .

• , . !

ahnheejong.name | github.com/hejeongahn | twitter.com/heejongahn

Page 128: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기
Page 129: TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기

• To Type or Not to Type: Quantifying Detectable Bugs in JavaScript

• TypeScript Design Goals

• Github Octoverse 2017

• Trade-offs in Control Flow Analysis #9998

• Treat `in` operator as type guard #10485

• Various TypeScript & VS Code release notes