์คํ๋ฆฐํธ ๋ฏธ์
์ ํ๋ค๊ฐ, React + JavaScript
๋ก ์ด๋ฃจ์ด์ง ํ๋ก์ ํธ๋ฅผ ํ์
์คํฌ๋ฆฝํธ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ๋ฏธ์
์ ๋ฐ๊ฒ ๋์๋ค.
๋ง์นจ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐฐ์ฐ๊ณ ์๋ ๋์ค์ด๋ผ ์ ๋ง ์ ํด๋ด์ผ์ง...! ํ๋ฉด์ ์ด์ฌํ ํ์์ผ๋, ์ฒ์์ด๋ค ๋ณด๋ ๋๋ฌด ์ฝ์ง์ ๋ง์ด ํ๋ค.
์ ์ฉ์ด ์๊ฐ๋ณด๋ค ์ด๋ ต๋ค. ๊ทธ๋ฅ ํ์ฅ์ ๋ฐ๊พธ๊ณ ๋ญ ํ๋ฉด ๋ ์๋๋~ ํ์ง๋ง ์ ๋ง ์๊ฐ๋ณด๋ค ์ค๋ฅ๊ฐ ๋ง์๋ค.
npm install --save typescript
๋ง์ฝ, ์ฌ์ฉํ๊ณ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ค๋ฉด ์ค์นํด์ฃผ๋๋ก ํ์.
Node์ ๊ฒฝ์ฐ, ts๋ฅผ ํด์ํ์ง ๋ชปํ๋ฏ๋ก ๊ผญ ts-node
๋ฅผ ์ค์นํด์ฃผ๋๋ก ํ์!
npm install --save @types/node @types/react @types/react-dom
style-components๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด @types๋ฅผ ์ค์นํ๋๋ก ํ์.
npm install @types/styled-components --save-dev
tsc --init
tsconfig๋, ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ณํํ ๋์ ์ค์ ์ ์ ์ํด ๋์ ํ์ผ์ด๋ค.
{
"compilerOptions": {
"baseUrl": "src",
"target": "es5",
"lib": ["dom", "es2015"],
"allowJs": true,
"checkJs": false,
"skipLibCheck": true,
"strict": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react", // or "react-jsx" for React 17+
"forceConsistentCasingInFileNames": true,
},
"include": ["src"]
}
d.ts ํ์ผ์ด๋ ํ์ ๋ง ์ ์ฅํ ์ ์๋ ํ์ผ ํ์์ด๋ค.
๋์ค์ js, jsx ํ์ผ์ tsx๋ก ํ์ฅ์ ๋ณ๊ฒฝ์ ํ๊ฒ ๋๋ค๋ฉด, ๋ถ๋ช import ์ svg, png ๋ฑ์ ์ธ์ํ์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ์ผ์ด๋๋ค.
ํ์
์คํฌ๋ฆฝํธ์ ํ์
์์คํ
๋ฒ์ ๋ฐ์ ์์ผ๋ฏ๋ก ์ค๋ฅ๊ฐ ์ผ์ด๋๊ธฐ์, ์ฐ๋ฆฌ๋ custom.d.ts
๋ผ๋ ํ์ผ์ ๋ง๋ค๊ณ ์ฌ๊ธฐ ์์ ์ปค์คํ
ํ์
์ ์ ์ธํ์ฌ ์ค๋ฅ๊ฐ ๋์ง ์๋๋ก ํ ๊ฒ์ด๋ค!
declare module '*.svg' {
const content: any;
export default content;
}
declare module '*.png' {
const content: any;
export default content;
}
declare module '*.jpg' {
const content: any;
export default content;
}
declare module '*.jpeg' {
const content: any;
export default content;
}
์ด์ ๋๋์ด ํ์ฅ์๋ช
๋ณ๊ฒฝ์ ํ ์๊ฐ์ด ์๋ค!
์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์, js, jsx๋ฅผ ์ ๋ถ tsx๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค๋ ์ ์ด๋ค.
์ด ๊ธ์ React+Typescript๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์ ์ ๋ก ์์ฑํ์์ผ๋ฏ๋ก, ๊ผญ tsx๋ก ๋ณ๊ฒฝํด์ฃผ๊ธธ ๋ฐ๋๋ค.
๋๋ ์ฒ์์ ts์ tsx๊ฐ ํท๊ฐ๋ ธ๊ธฐ์ ์๋ฌด ์๊ฐ ์์ด "js๋ก ์์ฑ๋์ด ์๋๊ฑด ts๋ก, jsx์ธ ๊ฑฐ๋ tsx๋ก ๋ฐ๊พธ๋ฉด ๋๊ฒ ์ง~" ๋ผ๊ณ ์๊ฐํ์ง๋ง, ์ ๋ง ํฐ ์ค์ฐ์ด์๋ค.
~์ ๊ฐ์ ์ฐธ์กฐํ์ง๋ง, ์ฌ๊ธฐ์๋ ํ์์ผ๋ก ์ฌ์ฉ๋๊ณ ์์ต๋๋ค...
์ด ์ค๋ฅ๋ ํ์
์คํฌ๋ฆฝํธ๊ฐ ๊ฐ๊ณผ ํ์
์ ์ ๋๋ก ๊ตฌ๋ถํ์ง ๋ชปํ ๋ ์๊ธฐ๋ ๋ฌธ์ ์ธ๋ฐ, ts๋ ๊ธฐ๋ณธ์ ์ผ๋ก jsx ๋ฌธ๋ฒ์ ์ธ์ํ์ง ๋ชปํ๋ค.
tsx๋ React ์ปดํฌ๋ํธ์ ํ์
์ ์๋์ผ๋ก ์ถ๋ก ํ๊ณ ์ฒ๋ฆฌํ ์ ์์ด์(JSX ๊ตฌ๋ฌธ์ ์ธ์) ์ค๋ฅ๊ฐ ์ผ์ด๋์ง ์๋ ๊ฒ์ด๋ค.
์ด๋ฐ ์ค๋ฅ๋ฅผ ๊ฒช๊ธฐ ์ซ์ผ๋ฉด tsx๋ก ํด๋์
๋นจ๊ฐ ์ค ์ฒ์ง์ธ ํ๋ก์ ํธ๋ฅผ ๋ณผ ์ ์๋๋ฐ, HTML ํ์ ๊ณผ Props ํ์ ๋ฑ์ ์ฒ์ฒํ ์ ํด๊ฐ๋ฉด์ ์ค๋ฅ๋ฅผ ์์ ๋ณด์!
interface
๋ฅผ ์ ์ฌ์ ์์ ํ์ฉํ๋ ๊ฒ์ด ๋ง์ ๋์์ด ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, TypeScript๊ฐ ์ฐ๋ฆฌ๊ฐ ์์ฑํ๋ ์ฝ๋, ์ปดํฌ๋ํธ์ ํ์ ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๋ก ํ๊ณ ๊ฒ์ฌํ ์ ์๋๋ก ํ๋ํ๋ ์ง์ ํด๋์.
article useState์ ๊ฒฝ์ฐ, ์ด๊น๊ฐ์ผ๋ก []๊ฐ ์ง์ ์ด ๋์ด ์๊ธฐ์ ์ ํํ ํ์ ์ถ๋ก ์ด ์ด๋ ต๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋
์์ ๊ฐ์ด ์ ํํ๊ฒ ํ์
์ ์ง์ ํด์ฃผ๋ ๊ฒ์ด ์ข๋ค.
keyword useState์ ๊ฒฝ์ฐ, ์ด๊น๊ฐ์ผ๋ก ""์ด ์ง์ ๋์ด ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ TypeScript๋ type ์ถ๋ก ์ ์ ํํ๊ฒ ํ ์ ์์ผ๋ฏ๋ก ๊ตณ์ด ์ง์ ํด์ค ํ์๊ฐ ์๋ค!
์ฒ์๋ถํฐ ๋๋ฌด ์๊ฒฉํ๊ฒ ์ ์ฉํ์ง ๋ง๊ณ , ์ ์ง์ ์ผ๋ก strict ๋ ๋ฒจ์ ์ฆ๊ฐ์ํค๋๋ก ํ์.
JavaScript์์ TypeScript๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ๊ฒ์ ์์ ์ธ๋ก ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ๋๋ํ๊ฒ ์ก์๋๊ณ ํด๋ณด์!
ํ์
์คํฌ๋ฆฝํธ๋ก ๋ฐ๊พธ๊ธฐ(๋ฒจ๋ก๊ทธ)
ํ์
์คํฌ๋ฆฝํธ ํ๊ฒฝ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๊ธฐ(๋ฒจ๋ก๊ทธ)
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์ ํ์
์คํฌ๋ฆฝํธ๋ฅผ ์ ์ฉํ ๋ ์ฃผ์ํด์ผ ํ ์ (ํธ๋๋ถ)