๐ฃ๏ธ ์ด ๊ธ์ ์๋ ๊ธ์ ๋ฒ์ญ๊ธ์
๋๋ค.
https://blog.logrocket.com/typescript-vs-flow-vs-proptypes/
Comparing statically typed JavaScript implementations - LogRocket Blog
In this post, we'll compare three of the most popular ways of imposing static typing on JavaScript: TypeScript, Flow, and PropTypes.
blog.logrocket.com
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ณ์์ ๋ฐ์ดํฐ ํ์
์ด ๋ฐํ์ ํ๊ฒฝ์์ ๊ทธ ๋ณ์์ ์ํด ๊ฒฐ์ ๋๊ณ , ํ๋ก๊ทธ๋จ์ ํตํด ์ฐ๋ฆฌ๊ฐ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๊ทธ ๋ณ์์ ํ ๋นํ ๊ฒฝ์ฐ์๋ ๋ณํ ์ ์๋ ๋์ ํ์
์ธ์ด(Dynamically typed language) ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์๋ ๋ณ์์ ํ์
์ ์ ํํ๊ฑฐ๋ ์ฃผ์ ์ฒ๋ฆฌํ ๋ฐฉ๋ฒ์ด ๋ด์ฅ๋์ด ์์ง ์๋ค. ์ฐ๋ฆฌ๊ฐ ํ๋ก๊ทธ๋จ์ ์์ฑํ ๋ ๋ณ์๊ฐ ๊ฐ์ ธ์ผ ํ๋ ํ์
์ ๋ํด ๊ณ ๋ฏผ์ ๋ง์ด ํ๋ ๊ฒ์ ๋์ด์ฃผ๊ณ ์กฐ๊ธ ๋ ๋น ๋ฅด๊ฒ ์์ฑํ ์ ์๊ฒ ํด์ฃผ์ง๋ง, ์ด ๋ง์ ๋ํ ์ฐ๋ฆฌ์ ํ๋ก๊ทธ๋จ์ด ๋ฒ๊ทธ๋ฅผ ๊ฐ๊ฑฐ๋ ๋ณ์๊ฐ ๋ค๋ฅธ ํ์
์ด ๋์ด ์๊ธฐ์น ๋ชปํ ํ๋์ ์ ๋ฐํ ์๋ ์๋ค๋ ๋ป์ด๊ธฐ๋ ํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ์ด๋ฌํ ๋์ ํ์ดํ์ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ์ธ์ด๋ก ์์ฑํ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ํธ๋์คํ์ผ ํด์ผ ํ๋ค. ์ด๋ฅผ ์ํด ๋ณ์๋ฅผ ์๊ฒฉํ๊ฒ ํ์ธํ๊ณ ์ ์ดํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์
์ต์คํ
์
์ด ํ์ํ๋ค.
์ฌ๊ธฐ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ ์ ํ์
์ต์คํ
์
์ ์ ๊ณตํ๋ ๋ง์ ์ธ์ด๋ค์ด ์๋ค.
์ด ๊ธ์ ํ์
์คํฌ๋ฆฝํธ, Flow, Prop Types ์ ์ด์ ์ ๋ง์ถ๊ณ ์ด ์ธ์ด๋ค์ ๊ธฐ๋ฅ๊ณผ ๋ฅ๋ ฅ์ ๋น๊ตํ๋ค.
โฃ Type-Checkiing ๋ผ์ด๋ธ๋ฌ๋ฆฌ / ์ธ์ด ๋น๊ตํ๊ธฐ
Typescript
Flow
Prop Types
๊ฐ๋ฐ์
Microsoft
Facebook
Facebook
๋ฆด๋ฆฌ์ฆ
2012.10.1
2014.11.18
2017.4.8
๋ผ์ด์ผ์ค
์คํ์์ค
MIT
MIT
์ปค๋ฎค๋ํฐ
ํผ
์์
์๋์ ์ผ๋ก ์์
Dependencies
Performace
๊ฐ์ฅ ๋น ๋ฅด๊ณ ๋ฒ๊ทธ๊ฐ ์ ๋ค
์ผ๋ถ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ณด๊ณ ๋จ. Flow ํ์ 2019๋
์ ์ฌ๊ฒ์ฌ ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๊ฐ์ํ๋ค๊ณ ๋ณด๊ณ ํ์ต๋๋ค.
๋ณด๊ณ ๋์ง ์์ ์ฑ๋ฅ ํต๊ณ
ํ์
์ฒดํฌ (type checking)
์๋ฐ์คํฌ๋ฆฝํธ ํ์
, ์ ๋ค๋ฆญ ํ์
์ ์, ์ ํ์ nullable ํ์
์ฌ์ฉ
์๋ง๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์
, ์ ๋ค๋ฆญ ํ์
์ ์, ์ ํ์ nullable ํ์
์ฌ์ฉ
์์ฒด ํ์
์ ํจ์ฑ ๊ฐ์ฒด ์ฌ์ฉ
ํ์
์บ์คํ
(type casting)
as ํค์๋ ์ฌ์ฉ
: ์ฌ๋ณผ ์ฌ์ฉ
N/A
interfaces, enums, ์ปค์คํ
ํ์
๊ฐ์ฒด ์ง์
interfaces, enums, ์ปค์คํ
ํ์
๊ฐ์ฒด ์ง์
interfaces, enums, ์ธํฐํ์ด์ค์ enum์ผ๋ก ํค์๋ ์ ์ธ๋จ
์์ฒด ์ต์
์ ์ฌ์ฉํ enum, PropTyps.oneOf([...]) ์ง์
ํ
์คํธ ์๋ํฐ ์ง์
IntelliSense(์๋ ์์ฑ), ์ ์๋ก ์ด๋, ์ค๋ฅ/๊ฒฝ๊ณ ๋ฑ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ฌ๋ฌ ํธ์ง ๊ธฐ/IDE์ ๋ํ ๋๊ท๋ชจ ์ง์
IntelliSense(์๋ ์์ฑ), ์ ์๋ก ์ด๋, ์ค๋ฅ/๊ฒฝ๊ณ ๋ฑ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ฌ๋ฌ ํธ์ง๊ธฐ/IDE์ ๋ํ ๋๊ท๋ชจ ์ง์
์ปดํฌ๋ํธ propTypes์ ์๋ ์์ฑํ๊ธฐ ์ํ Visual studio code, Webstorm์ ์ ํ๋ ์ง์
Resources and Documentation
์ปค๋ฎคํฐ๋์ ํ๋ก์ ํธ ์ง์
Nest.js๋ฅผ ํฌํจํ์ฌ Vue, React, Angular, Express ๋ฑ ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ฌ๋ฌ ํ๋ ์์ํฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ง์
๋ฐ๋ฒจ์ ํตํด ํ๋ก์ ํธ์ ์ค์น ๊ฐ๋ฅ, ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก React์ ์ฌ์ฉ
์ฃผ๋ก React์ ์ฌ์ฉ๋์ง๋ง PropTypes.checkPropTypes๋ฅผ ํธ์ถํด ๋ค๋ฅธ ํ๋ ์์ํฌ์ ์ฌ์ฉ๊ฐ๋ฅ
์ปดํ์ผ๋ฌ ์๋ฌ ๊ฐ์ง
IDE์ ํ
์คํธ์๋ํฐ์์ ๊ฐ๋ฅ
์ง์๋๋ IDE์ ํ
์คํธ์๋ํฐ์์ ๊ฐ๋ฅ
์ฌ์ฉ ๋ถ๊ฐ
Syntax
๊ด๋ฒ์ํ ํ์
์ฒดํน, ์ ์ ๋์ ํ์
ํฌํจ
๊ด๋ฒ์ํ ํ์
์ฒดํน, ์ ์ ๋์ ํ์
ํฌํจ
PropTypes ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์์กด
์ ๋๋ฆญ(Generics)
์ง์๋จ
์ง์๋จ
์ง์ ์ ๋จ
๊ธฐ์กด ํ๋ก์ ํธ ์ง์
ํ์
์คํฌ๋ฆฝํธ๋ ํ์
์คํฌ๋ฆฝํธ๋ฅผ ์ง์ํ๊ธฐ ์ํด ์ถ๊ฐ ๊ฐ๋ฅ
๋ฐ๋ฒจ๊ณผ ํจ๊ป ์ง์ ๊ฐ๋ฅ
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น์ PropTypes.checkPropTypes ์๋ ํธ์ถ์ ํตํด ์ง์
์ด ๊ธ์์๋ ์ด๋ฌํ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ/์ธ์ด์ ๊ธฐ์ ๊ณผ ๋ฅ๋ ฅ์ ๋น๊ตํ๊ณ ๋์กฐํ ๊ฒ์ด๋ค.
์ ์ฌ์ ๊ณผ ์ฐจ์ด์ ์ ํ์ํ ๋ ๋จผ์ ์ฃผ๋ชฉํด์ผ ํ ์ค์ํ ์ฐจ์ด์ ์ TypeScript์ ๋ฌ๋ฆฌ Flow ๋ฐ PropTypes๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ์๋๋ผ๋ ๊ฒ์ด๋ค. Flow์ Prop Types๋ ์ค์ง ์ ์ ํ์
์ฒดํน ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฉฐ ์ฐจ์ด์ ์ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฉ์ ์ง์ํ๋ ํ๋ ์์ํฌ์ ์ํฅ์ ๋ฏธ์น๋ค.
โ๏ธ ํ๋ก์ ํธ์ ํ์
์คํฌ๋ฆฝํธ ์ค์นํ๊ธฐ
ํ์
์คํฌ๋ฆฝํธ๋ ์ด ๊ธ์์ ๋น๊ตํ ์ธ ๊ฐ์ง ๊ธฐ์ ์ค ๊ฐ์ฅ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ฉฐ Vue, Angular ๋๋ React์์ ์ฆ์ ํ์
์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ฝ๋ค.
์๋ฅผ ๋ค์ด, ์ฐ๋ฆฌ๋ Typescript์ ํจ๊ป Vue๋ฅผ ์ค์นํ ๋ Vue CLI์์ ๋ด์ฅ๋ Typescript ์ต์
์ ์ ํํด ์ค์นํ ์ ์๋ค. Typescipt๋ฅผ ์ ํํ๋ฉด ์ฐ๋ฆฌ๋ tsconfig.json ํ์ผ(๋ณดํต ๋ธ๋ผ์ฐ์ ์ ์ต๋ ์ง์์ ์ํด ECMAScript 2009 ์ค์ )์์ Javascript๋ก ํธ๋์คํ์ผํ๊ธฐ ์ํ ๊ตฌ์ฑ์ ํ ์ ์๋ค.
// tsconfig.json
{
"compilerOptions": {
// Vue์ ๋ธ๋ผ์ฐ์ ์ง์์ ์ํด
"target": "es5",
// ์ด๋ฅผ ํตํด 'this'์ ๋ํ ๋ฐ์ดํฐ ์์ฑ์ ์๊ฒฉํ๊ฒ ์ถ๋ก ํ ์ ์์
"strict": true,
// webpack 2+ ๋๋ rollup์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํธ๋ฆฌ ์์ดํน์ ํ์ฉํ๋ ค๋ฉด ์๋๋ฅผ ์
๋ ฅ
"module": "es2015",
"moduleResolution": "node"
}
}
๊ทธ๋ฆฌ๊ณ ๋์ ์ปดํฌ๋ํธ ์์ฑ์ Vue๋ฅผ ์ฐธ์กฐํ๋ฉด Typescript ํ์
์ถ๋ก ์ ์ป๊ฒ ๋๋ค.
import Vue from 'vue'
const Component = Vue.extend({
// ...
})
๋ํ Vue๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํด๋์ค ๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ ์ ํ ํน๋ณํ ๋ฐฉ์์ผ๋ก Typescript๋ฅผ ์ฌ์ฉํด ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ์ ์๋ค.
<template>
<button @click="onClick">Click!</button>
</template>
<script lang="ts">
import * as Vue from "vue";
import { Component } from "vue-property-decorator";
@Component()
class App extends Vue {
public message: string = "Hello World";
public onClick(): void {
window.alert(this.message);
}
}
export default App;
</script>
์ฌ๊ธฐ์ ์ผ๋ถ Typescript ์ด๋
ธํ
์ด์
๊ณผ ํจ๊ป Javascript ์นํ์ ์ธ ๊ตฌ๋ฌธ์ ๋ณผ ์ ์๋ค. ์๋ฅผ ๋ค์ด Angular๋ Typescript์ ํจ๊ป ์ค์น๋๊ณ Typescript๋ฅผ ๊ฑฐ์ ๋
์ ์ ์ผ๋ก ์ฌ์ฉํ๋ค. ํ๋ Angular ์ฑ์ ์์ Javascript๋ก ์์ฑํ๋ ์ต์
์ด ์์๋๋ฐ ์ธ๊ธฐ๋ฅผ ๋์ง๋ ๋ชปํ๋ค.
โ๏ธ ํ๋ก์ ํธ์ Flow ์ค์นํ๊ธฐ
๋ฐ๋ฉด์, Babel ๊ตฌ์ฑ์ Flow ์ง์์ ํ์ฑํํด ํ๋ก์ ํธ์ Flow๋ฅผ ์ถ๊ฐํ ์๋ ์๋ค.
Flow๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด ์๋ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ค.
npm install --save-dev @babel/preset-flow
๊ทธ๋ฆฌ๊ณ .babelrc์ ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
{
"presets": ["@babel/preset-flow"]
}
โ๏ธ ํ๋ก์ ํธ์ PropTypes ์ค์นํ๊ธฐ
ํ๋ก์ ํธ์ PropTypes๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด PropTypes ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํ๊ณ , ์ปดํฌ๋ํธ์ prop types๋ฅผ ์ ์ํ๊ณ PropTypes . checkPropTypes์ ํธ์ถํ๋ค.
Prop Types๋ฅผ ์ค์นํ๊ธฐ ์ํด ๋ค์ ๋ช
๋ น์ด๋ฅผ ํธ์ถํ๋ค.
npm install --save prop-types
๊ทธ๋ฆฌ๊ณ ๋์ ์ปดํฌ๋ํธ์ prop type ์ ํจ์ฑ ๊ฒ์ฆ์ ์ ์ํ๊ณ ํ๋กํผํฐ์ values ๊ฐ์ฒด๋ฅผ ์ค์ ํ๋ค.
const myPropTypes = {
name: PropTypes.string,
age: PropTypes.number,
// ... prop types ๊ฒ์ฆ์ ์ ์ํ๋ค
};
const props = {
name: 'hello', // ์ ํจ
age: 'world', // ์ ํจํ์ง ์์
};
๊ทธ๋ฆฌ๊ณ Prop Type์ ์ฒดํฌํ๋ค.
// 'MyComponent' ์ปดํฌ๋ํธ๋ก ์ ์ํ๋ค
// Works with standalone PropTypes
PropTypes.checkPropTypes(myPropTypes, props, 'age', 'MyComponent');
// ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๋ฅผ ๋ฐํํ๋ค
// Warning: Failed prop type: Invalid prop `age` of type `string` supplied to
// `MyComponent`, expected `number`.
ํ์
์ ์์ ๊ตฌ๋ฌธ ์ฒดํฌ
์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ์ธ ๊ฐ์ง ๊ธฐ์ ๋ชจ๋ ๋ณ์์ ๋ํ ํ์
์ฒดํฌ ๋ฐ ์ ํ์ ์ ๊ณตํ๋ฉฐ ์ด๊ฒ๋ค์ ๋น๊ตํด ๋ณด๋ ค ํ๋ค.
๐ ๏ธ Flow์ Typescript์ ํ์
์ ์
Flow์ Typescript๋ ์๋นํ ์ ์ฌํ ํ์
์ ์ ๊ตฌ๋ฌธ์ ๊ฐ๊ณ ์๋ค.
๊ณตํต์ :
๋ณ์ ํ์
์ฒดํฌ์ ๋ํ Javascript ์์ ํ์
๊ณผ ํ์(๊ฐ์ฒด)๋ ํ์
์ ์ ๊ณต
์ ์ฌํ ํ์
์ด๋
ธํ
์ด์
๊ตฌ๋ฌธ์ ๊ฐ์ง๊ณ ์์
์ฐ์ฐ์์ ๋ค์ํ ์ ํธ๋ฆฌํฐ ํ์
์ ์ฌ์ฉํ์ฌ Javascript ํ์
์์คํ
์ ์ ์ฐ์ฑ์ ์ ์ง
์ ํ์ ํ๋กํผํฐ์ ๋ํ ํ์
, ์ฆ Typescript๋ nullable ํ์
์ด ์๊ณ Flow์๋ maybe ํ์
์ด ์์
๋ณ์ ํ์
์ ๊ฐ๋ ์ฝ๋๋ฅผ ์์ฑํ๋๋ฐ ์ฌ์ฉํ๋ ์ ๋๋ฆญ์ด ์์
๋ง์ง๋ง ๊ณตํต์ ์ ์์๋ ์๋์ ์๋ค.
function identity<T>(value: T): T {
return value
}
์ ๋ค๋ฆญ์ ๋ค๋ฅธ ํ์
๋ค๋ก ๋ฎ์ด ์์ฌ์ง ์ ์๋ ๋ณ์ ํ์
์ ๊ฐ์ง๋ค :
identity<string>('foo').
๋ํ ๋ค์ ์ฝ๋๋ Typescript์ Flow์์ ๋์ผํ๋ค. ์ฌ๊ธฐ์ ํจ์ concat์ ๋ฌธ์ ์ ํ์ธ ๋ ๋ณ์๋ฅผ ๊ฐ์ง๊ณ ๋์ ํฉ์ ๋ฐํํ๋ค.
function concat(a: string, b: string) {
return a + b;
}
๐ ๏ธ PropTypes์ ํ์
์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ
๋ฐ๋ฉด์ PropTypes๋ ์ปดํฌ๋ํธ์ ํ๋กํผํฐ ์ค์ ์ ์ํด ์์ฒด ํ์
์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ค. ์ฆ, PropTypes์์๋ PropTypes ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ํ์
์ ์ ์ํ๋ค.
import React from 'react';
import PropTypes from 'prop-types'
class MyComponent extends React.Component {
render() {
// ... do things with the props
}
}
MyComponent.propTypes = {
optionalArray: PropTypes.array,
...
๐ ๏ธ ํ์
์บ์คํ
Flow์ Typescript ๋ชจ๋ ๋ณ์๋ฅผ ํ ํ์
์์ ๋ค๋ฅธ ํ์
์ผ๋ก ๋ช
์์ ์ผ๋ก ์บ์คํ
ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
Flow์์๋ ๊ธฐํธ : ๋ฅผ ์ฌ์ฉํด ์บ์คํ
ํ๊ณ Typescript์์๋ as ํค์๋๋ฅผ ์ฌ์ฉํด ์บ์คํ
ํ๋ค.
// TypeScript
let value = 1 as number;
// Flow
let value = 1;
(value: number);
PropTypes๋ ํ ํ์
์์ ๋ค๋ฅธ ํ์
์ผ๋ก ๋ช
์์ ์ผ๋ก ์บ์คํ
ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์๋๋ค.
๐ ๏ธ Interfaces, enums, ์ปค์คํ
ํ์
Interface๋ ๊ฐ์ฒด์ ๊ตฌ์กฐ์ ํ๋กํผํฐ๋ฅผ ์ ํํ๋ ํ์
์ ์์ด๋ค. Enums ๋ ์ด๊ฑฐ๋ ๊ฐ๋ค์ด๋ฉฐ ๋ณ์๋ฅผ enum ๊ฐ ์ค ํ๋๋ก ์ ํํด ํ์
์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. Flow, TypeScript ๋ฐ PropTypes๋ฅผ ์ฌ์ฉํ๋ฉด ์ปค์คํ
ํ์
์ ํ์ ํ ์ ์๋ค.
Flow์ TypeScript๋ interface ํค์๋๋ฅผ ์ฌ์ฉํด ์ปค์คํ
ํ์
๊ฐ์ฒด๋ฅผ ์ ์ํ๋ค. ๋ชจ๋ implements ํค์๋๋ฅผ ์ฌ์ฉํด ํด๋์ค๊ฐ ์ธํฐํ์ด์ค์ ๊ตฌ์กฐ๋ฅผ ์์ํ ์ ์๊ฒ ํ๋ค. ์๋ ์์๋ฅผ ์ดํด๋ณด์.
interface PersonInterface {
firstName: string;
lastName: string;
fullName(firstName: string, lastName: string): string
}
class Person implements PersonInterface {
firstName: string;
lastName: string;
constructor(firstName: string, lastName: string){
this.firstName = firstName;
this.lastName = lastName;
}
fullName(firstName: string, lastName: string): string {
return `${firstName} ${lastName}`;
}
}
๋ง์ฝ ์ธํฐํ์ด์ค์ ์๋ ๋ชจ๋ ๊ฐ์ ๊ตฌํํ์ง ์์ผ๋ฉด Flow์ Typescript๋ ์๋ฌ๋ฅผ ๋ฐํํ ๊ฒ์ด๋ค.
Flow์ Typescript ๋ํ ํ์
์ฒดํน์ ์ํด enum ํค์๋๋ฅผ ์ฌ์ฉํด enum ๋ฆฌ์คํธ๋ฅผ ์ ์ํ๋ค.
enum Status {
Active,
Paused,
Off,
}
const status: Status = Status.Active //์ผ์น
const wrongStatus: Status = 'test' //๋ถ์ผ์น, ์ ์๋ ํ์
์ ๋ฐ๋ฅด์ง ์์
ํ ๊ฐ์ง ๋
ํนํ Flow์ ํน์ง์ ํ์
์ฒดํน ์ฝ๋๋ฅผ ์๋์ ๊ฐ์ด ์ฃผ์์ ์ด๋ค๋ ์ ์ด๋ค.
function greet(greeting /*: string*/) /* : string */ {
return greeting;
}
ํ์
์คํฌ๋ฆฝํธ์์๋ ์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋ฌ๋ ์ฃผ์์๋ ์๋์์ฑ ๋๋ ๊ตฌ๋ฌธ ํ์ด๋ผ์ดํธ ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ ํฐ ์ฅ์ ์ด ์๋๋ค.
๋ฐ๋ฉด์ PropTypes์ ์๋์ ๊ฐ์ด PropTypes.oneof๋ฅผ ์ฌ์ฉํด enum ํ์ดํ์ ์ ์ํ๋ค.
...
optionalEnum: PropTypes.oneOf(['News', 'Photos']),
...
PropTypes๋ ๋ํ PropTypes . shape์ ์ด์ฉํด ๊ฐ์ฒด ํ์
๊ตฌ์กฐ๋ฅผ ์ ์ํ๋ค.
...
optionalObjectWithShape: PropTypes.shape({
optionalProperty: PropTypes.string,
requiredProperty: PropTypes.number.isRequired
}),
...
๐ง ํ
์คํธ ์๋ํฐ ์ง์
Flow์ Typescript ๋ชจ๋ Visual Studio Code์ Sublime๊ณผ ๊ฐ์ ์๋ํฐ๊ฐ ์ง์ํ๋ ๋ด์ฅ๋ ํ๋ฌ๊ทธ์ธ ์ง์์ ๊ฐ์ง๊ณ ์๋ค.
Flow์ TypeScript์ ๋ํ ์๋ํฐ ์ง์์ ๊ฐ๋ฐ์๊ฐ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
IntelliSense (์๋์์ฑ)
Go to Definition(์ ์๋ก ์ด๋) / Peek Definition (์ ์ ๋ณด๊ธฐ)
Diagnostics(์ง๋จ) (Errors, Warnings)
ํ์
์ ๋ณด hover
์ ํ ๊ฐ๋ฅํ ์ฝ๋ ์ ์ฉ ๋ฒ์ ๋ฆฌํฌํธ
Babel์ ํตํด ๊ธฐ์กด ํ๋ก์ ํธ์ Flow ์ค์น๋ฅผ ์ง์ํ๋ ๋ฌธ์ ๋ ์์ต๋๋ค. Flow ์ง์ ๋ฐ TypeScript ์๋ํฐ ์ง์ ์ ์ํ ์๋ํฐ/IDE ์ค์น์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฝ์ด๋ณด์ธ์.
PropTypes ๋ํ ํ ๋น๋ ๊ฐ์ ๋ํด ์ปดํฌ๋ํธ์ prop types์ ์๋ ์์ฑํด์ฃผ๋ Visual Studiio code ๊ธฐ๋ฅ์ด ์๋ค.
PropTypes์๋ PropTypes.checkPropTypes๋ฅผ ํธ์ถํ์ฌ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ฉํ ์๋ ์๋ค(React์์๋ ์๋์ผ๋ก ํธ์ถ๋จ). PropTypes์ ๊ณต์ ๋ฌธ์์๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ง์์ ๋ํ ์ธ๊ธ์ด ์์ง๋ง, ์ด๊ฒ์ด ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํ ์ธ๋ถ ๋ฌธ์๋ ๋ง์ง ์๋ค.
๐ง ํจ์จ์ฑ๊ณผ ์ฑ๋ฅ
Flow๊ณผ Typescript์ ์ฑ๋ฅ์ ์ฐจ์ด๋ ์๋ค. TypeScript๋ ์ง์์ ์ผ๋ก 500-600MB์ RAM์ ์ฌ์ฉํ๋ฉฐ Flow๋ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค. ์ปดํจํ
์์์ ํจ์จ์ฑ ์ธก๋ฉด์์๋ ๋ ์ฌ์ด์ ํฐ ์ฐจ์ด๊ฐ ์๋ค.
PropTypes์ ํจ์จ์ฑ? ์ด Reddit ์ค๋ ๋ ์ ๋ฐ๋ฅด๋ฉด TypeScript๋ ๋ ๋น ๋ฅด๊ณ ๋ฒ๊ทธ๊ฐ ์ ๋ค.
๐ฅ ์ปค๋ฎค๋ํฐ ์ง์
TypeScript์ ์ปค๋ฎค๋ํฐ๋ Flow ๋ฐ PropTypes๊ณผ ๋น๊ตํ๋ฉด ๊ฐ์ฅ ํฌ๋ค. Flow์ PropTypes๋ ์ด์ ์ ๋งํ๋ ๊ฒ์ฒ๋ผ ๊ณต์ ์์ค๋ฅผ ์ ์ธํ๋ฉด ๋ฌธ์๊ฐ ์ ๊ณ StackOverflow์ ์ง๋ฌธ๋ ์ ๋ค.
Vue, Angular ๋ฐ React ๊ฐ์ ๋ง์ ํ๋ก ํธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํ๋ ์์ํฌ ๋ฐ ํ๋ซํผ์๋ TypeScript์ ๋ํ ์ง์์ด ๋ด์ฅ๋์ด ์๋ค. Express์ ๊ฐ์ Node.js ์น ํ๋ ์์ํฌ์ TypeScript๋ฅผ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ Nest.js๋ TypeScript๊ฐ ๋ด์ฅ๋์ด ์๋ ์ํ๋ก ๊ตฌ์ถ๋์ด ํ๋ก์ ํธ๋ฅผ ํฌ๊ฒ ๋ณ๊ฒฝํ์ง ์๊ณ TypeScript๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
Express์์ TypeScript๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์ ๋ช
๋ น์ ์คํํ์ฌ TypeScript ํธ๋์คํ์ผ๋ฌ๋ฅผ ์ค์นํ๋ฉด ๋๋ค.
npm install --save-dev typescript
๊ทธ๋ฐ ๋ค์ tsconfig.json ํ์ผ์ ์ถ๊ฐํด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์ฌ TypeScript ํธ๋์คํ์ผ๋ฌ๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค.
{
"compilerOptions": {
"module": "commonjs",
"esModuleInterop": true,
"target": "es6",
"noImplicitAny": true,
"moduleResolution": "node",
"sourceMap": true,
"outDir": "dist",
"baseUrl": ".",
"paths": {
"*": [
"node_modules/*"
]
}
},
"include": [
"src/**/*"
]
}
Express ๋ฐ Node์ ๋ํ ํ์
์ ์๋ฅผ ์ค์นํ๋ ค๋ฉด ๋ค์์ ์คํํ๋ค.
npm install --save-dev @types/node @types/express
๋ณด๋ค์ํผ, ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ ์์ํฌ์ ๋ํด TypeScript ํ์
์ ์๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ TypeScript๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ทธ๋ฆฌ ์ด๋ ต์ง ์๋ค. TypeScript์ ๋ํ ๋ ๋ง์ ํ์
์ ์๋ฅผ ๋ณด๋ ค๋ฉด ํ์คํ ํ์
์ด ์ง์ ๋ ์น ์ฌ์ดํธ๋ก ์ด๋ํด ๋ณด๋ฉด ๋๋ค.
๐ ๋ฆฌ์์ค์ ๋ฌธ์
TypeScript๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฆฌ์์ค ๋ฐ ๋ฌธ์์ ์ ์ธก๋ฉด์์ ํ์คํ ๋ค๋ฅธ ์ ์ ํ์
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ณด๋ค ๊ฒฝ์๋ ฅ์ด ์๋ค. TypeScript๋ ๋ค์์ ์ ๊ณตํ๋ค:
์ถ๊ฐ ์ด์ ์ผ๋ก TypeScript์ ํ๋ ์ด๊ทธ๋ผ์ด๋๋ ๋ค์ํ ๋ฒ์ ์ TypeScript๋ฅผ ์ง์ํ๋ฏ๋ก ๋ค์ํ ๋ฒ์ ์ TypeScript ํธ๋์คํ์ผ๋ฌ์์ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ํ์ธํ ์ ์๋ค.
๐ฎ ๊ฒฐ๋ก
TypeScript๋ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ ์์ํฌ์์ ์ง์๋๋ฏ๋ก ๋ง์ ์ฌ๋๋ค์ด ๋งค์ผ TypeScript๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค. ๋ง์ ์์ ์ ์ค๋ช
์ ํฌํจํด TypeScript์ ๊ฐ ๊ธฐ๋ฅ์ ๋ํ ๋ง์ ์ ๋ณด๊ฐ ์๊ณ , ์ ์ ํ์ดํ ์ ๊ตฌํํ๋ ๋ฐ ๊ฐ์ฅ ์ ํฉํ ์ต์
์ผ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
๋ฐ๋ฉด Flow๋ React๋ก Flow๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ผ๋ถ ๋ฌธ์์ ์งง์ ๋ฌธ์๋ง ์์ผ๋ฉฐ, ์ด๋ ๋ค๋ฅธ JavaScript ํ๋ ์์ํฌ์์ Flow๋ฅผ ์ค์ ํ๋ ๋ฐ์๋ ์ ์ฉํ ์ ์๋ค. ๋ํ ์ง๊ธ๊น์ง PropTypes์ ์ธ ๊ฐ์ง ์ต์
์ค ๊ฐ์ฅ ๋๋ฌธ ๋ฌธ์๋ฅผ ๊ฐ๊ณ ์์ง๋ง ์ด๋ฐ ๊ฒ์๋ฌผ๋ ๋ช ๊ฐ ์๋ค.
๐ง ๋ง๋ฌด๋ฆฌ ๋
ธ๋ ์ถ์ฒ..
์์ฌ์ ๋ฐ๋ํธ์ผ๋ก - ์ต์ ๋ฆฌ
์์
์ด ํ์ํ ์๊ฐ, ๋ฉ๋ก
www.melon.com