[TS] ๐ŸธJavaScript์—์„œ TypeScript๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•ด๋ณด์ž!

Junยท2024๋…„ 6์›” 2์ผ
0

TypeScript

๋ชฉ๋ก ๋ณด๊ธฐ
2/2
post-thumbnail
post-custom-banner

์–ด์ฉŒ๋‹ค๊ฐ€ ํ•˜๊ฒŒ ๋˜์—ˆ๋‚˜

์Šคํ”„๋ฆฐํŠธ ๋ฏธ์…˜์„ ํ•˜๋‹ค๊ฐ€, React + JavaScript๋กœ ์ด๋ฃจ์–ด์ง„ ํ”„๋กœ์ ํŠธ๋ฅผ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ๋ฏธ์…˜์„ ๋ฐ›๊ฒŒ ๋˜์—ˆ๋‹ค.

๋งˆ์นจ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐฐ์šฐ๊ณ  ์žˆ๋˜ ๋„์ค‘์ด๋ผ ์ •๋ง ์ž˜ ํ•ด๋ด์•ผ์ง€...! ํ•˜๋ฉด์„œ ์—ด์‹ฌํžˆ ํ•˜์˜€์œผ๋‚˜, ์ฒ˜์Œ์ด๋‹ค ๋ณด๋‹ˆ ๋„ˆ๋ฌด ์‚ฝ์งˆ์„ ๋งŽ์ด ํ–ˆ๋‹ค.

์ ์šฉ์ด ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต๋‹ค. ๊ทธ๋ƒฅ ํ™•์žฅ์ž ๋ฐ”๊พธ๊ณ  ๋ญ ํ•˜๋ฉด ๋ ์•„๋‹ˆ๋ƒ~ ํ•˜์ง€๋งŒ ์ •๋ง ์ƒ๊ฐ๋ณด๋‹ค ์˜ค๋ฅ˜๊ฐ€ ๋งŽ์•˜๋‹ค.

์ ์šฉ ์ˆœ์„œ

1. TypeScript ์„ค์น˜

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

2. tsconfig.json ์ƒ์„ฑํ•˜๊ธฐ

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"]

}

3. custom.d.ts ํŒŒ์ผ ์ถ”๊ฐ€

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;
}

4. ๐Ÿ˜ค ๋Œ€๋ง์˜ ํ™•์žฅ์ž๋ช… ๋ณ€๊ฒฝ (tsx)

์ด์ œ ๋“œ๋””์–ด ํ™•์žฅ์ž๋ช… ๋ณ€๊ฒฝ์„ ํ•  ์‹œ๊ฐ„์ด ์™”๋‹ค!
์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€, js, jsx๋ฅผ ์ „๋ถ€ tsx๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

์ด ๊ธ€์€ React+Typescript๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ „์ œ๋กœ ์ž‘์„ฑํ•˜์˜€์œผ๋ฏ€๋กœ, ๊ผญ tsx๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๊ธธ ๋ฐ”๋ž€๋‹ค.

4.1 ์Šฌํ”ˆ ์˜ค๋ฅ˜์˜ ์‹œ๊ฐ„


๋‚˜๋Š” ์ฒ˜์Œ์— ts์™€ tsx๊ฐ€ ํ—ท๊ฐˆ๋ ธ๊ธฐ์— ์•„๋ฌด ์ƒ๊ฐ ์—†์ด "js๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ๋Š”๊ฑด ts๋กœ, jsx์ธ ๊ฑฐ๋Š” tsx๋กœ ๋ฐ”๊พธ๋ฉด ๋˜๊ฒ ์ง€~" ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ์ •๋ง ํฐ ์˜ค์‚ฐ์ด์˜€๋‹ค.

~์€ ๊ฐ’์„ ์ฐธ์กฐํ•˜์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค...

์ด ์˜ค๋ฅ˜๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ฐ’๊ณผ ํƒ€์ž…์„ ์ œ๋Œ€๋กœ ๊ตฌ๋ถ„ํ•˜์ง€ ๋ชปํ•  ๋•Œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ธ๋ฐ, ts๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ jsx ๋ฌธ๋ฒ•์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ๋‹ค.
tsx๋Š” React ์ปดํฌ๋„ŒํŠธ์˜ ํƒ€์ž…์„ ์ž๋™์œผ๋กœ ์ถ”๋ก ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์„œ(JSX ๊ตฌ๋ฌธ์„ ์ธ์‹) ์˜ค๋ฅ˜๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฐ ์˜ค๋ฅ˜๋ฅผ ๊ฒช๊ธฐ ์‹ซ์œผ๋ฉด tsx๋กœ ํ•ด๋‘์ž

๋นจ๊ฐ„ ์ค„ ์ฒœ์ง€์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, HTML ํƒ€์ž…๊ณผ Props ํƒ€์ž… ๋“ฑ์„ ์ฒœ์ฒœํžˆ ์ •ํ•ด๊ฐ€๋ฉด์„œ ์˜ค๋ฅ˜๋ฅผ ์—†์• ๋ณด์ž!

interface๋ฅผ ์ ์žฌ์ ์†Œ์— ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋งŽ์€ ๋„์›€์ด ๋œ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ, TypeScript๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ–ˆ๋˜ ์ฝ”๋“œ, ์ปดํฌ๋„ŒํŠธ์˜ ํƒ€์ž…์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๋ก ํ•˜๊ณ  ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋‚˜ํ•˜๋‚˜ ์ง€์ •ํ•ด๋‘์ž.


4.2 ๋‹ค ์ง€์ •ํ•ด์•ผ ํ•˜๋‚˜์š”?

article useState์˜ ๊ฒฝ์šฐ, ์ดˆ๊นƒ๊ฐ’์œผ๋กœ []๊ฐ€ ์ง€์ •์ด ๋˜์–ด ์žˆ๊ธฐ์— ์ •ํ™•ํ•œ ํƒ€์ž… ์ถ”๋ก ์ด ์–ด๋ ต๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š”


์œ„์™€ ๊ฐ™์ด ์ •ํ™•ํ•˜๊ฒŒ ํƒ€์ž…์„ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.


keyword useState์˜ ๊ฒฝ์šฐ, ์ดˆ๊นƒ๊ฐ’์œผ๋กœ ""์ด ์ง€์ •๋˜์–ด ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ TypeScript๋Š” type ์ถ”๋ก ์„ ์ •ํ™•ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ตณ์ด ์ง€์ •ํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค!

์ฒ˜์Œ๋ถ€ํ„ฐ ๋„ˆ๋ฌด ์—„๊ฒฉํ•˜๊ฒŒ ์ ์šฉํ•˜์ง€ ๋ง๊ณ , ์ ์ง„์ ์œผ๋กœ strict ๋ ˆ๋ฒจ์„ ์ฆ๊ฐ€์‹œํ‚ค๋„๋ก ํ•˜์ž.


๋งˆ์น˜๋ฉฐ

JavaScript์—์„œ TypeScript๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ๊ฒƒ์€ ์˜ˆ์ƒ ์™ธ๋กœ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๋‹ˆ ๋„‰๋„‰ํ•˜๊ฒŒ ์žก์•„๋‘๊ณ  ํ•ด๋ณด์ž!

์ฐธ๊ณ  ์ž๋ฃŒ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ๋ฐ”๊พธ๊ธฐ(๋ฒจ๋กœ๊ทธ)
ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ™˜๊ฒฝ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ(๋ฒจ๋กœ๊ทธ)
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์— ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ (ํ•ธ๋“œ๋ถ)

profile
์—ด์‹ฌํžˆ ์•„์ž์•„์ž
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€