๐Ÿงช TypeScript | JavaSript๋ฅผ TypeScript๋กœ ๋ฐ”๊พธ๊ธฐ

dayannneยท2023๋…„ 7์›” 19์ผ
1

TypeScript

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

โœจ ์‹œ์ž‘ํ•˜๋ฉฐ

๊ธฐ์กด์— js, jsx์™€ ๊ฐ™์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑํ•˜๋˜ React ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋“ค์„ TypeScript(ํƒ€์ž…์ŠคํŠธ๋ฆฝํŠธ)๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ด ๋ณด๋ฉด์„œ ์ ์šฉํ•œ ๋ฐฉ๋ฒ•๊ณผ, ์ ์šฉํ•˜๋ฉด์„œ ์”จ๋ฆ„ํ•œ ์˜ค๋ฅ˜๋“ค์— ๊ด€ํ•ด ๊ธฐ๋กํ•ด ๋ณด๋ ค ํ•œ๋‹ค.


1. ์ ์šฉ ๋ฐฉ๋ฒ•

1) Typescript ์„ค์น˜

npm install --save typescript

์ ์šฉํ•  ํ”„๋กœ์ ํŠธ์— typescript๋ฅผ ์„ค์น˜ํ•ด ์ค€๋‹ค

2) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

typescript ์„ค์น˜๋งŒ ์ง„ํ–‰ํ•œ ํ›„ ์ž‘์—…ํ•˜๋‹ค
๋ช‡ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ฒผ๋‹ค. (ํŠนํžˆ styled-components)
์•„๋ž˜์™€ ๊ฐ™์ด ๊ธฐ์กด JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ @types/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์„ค์น˜ํ•ด ์ฃผ์ž.

์˜ˆ์‹œ)
@types/styled-components
@types/react-dom
@types/axios

๋‚˜์˜ ๊ฒฝ์šฐ ํ•ต์‹ฌ์ ์ธ react, react-dom, styled-components, axios ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ @types/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์žฌ์„ค์น˜ ํ•ด์ฃผ์—ˆ๊ณ ,
์ดํ›„ ์ถ”๊ฐ€๋กœ ์„ค์น˜ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ ์ผ๋ฐ˜ ์„ค์น˜ ํ›„ @types๋กœ ์„ค์น˜ ๋‘๋ฒˆ์„ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค. (@types/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜๋งŒ ์ง„ํ–‰ํ•˜๋ฉด ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ž‘๋™์ด ๋˜์ง€ ์•Š์•˜๋‹ค.)

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

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ํ›„ ๋ฐ”๋กœ ts ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ–ˆ์„ ๋•Œ ๋งŽ์€ ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋‚ฌ๋Š”๋ฐ, ๊ทธ ์ค‘ ์ œ์ผ ์„ฑ๊ฐ€๊ฒผ๋˜ ์˜ค๋ฅ˜ ๋‘๊ฐ€์ง€๊ฐ€ import ์‹œ svg, png, jpg, jpeg ๋“ฑ์˜ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ, ๊ทธ๋ฆฌ๊ณ  styled-component๋„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

  • srcํด๋” ๋ฐ”๋กœ ํ•˜์œ„์— custom.d.ts๋ผ๋Š” ์ด๋ฆ„์˜ ํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค.
  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ด ์ค€๋‹ค.
declare module '*.svg' {
  const content: any;
  export default content;
}
declare module '*.jpg' {
  const value: any;
  export default value;
}
declare module '*.png' {
  const value: any;
  export default value;
}



declare module 'styled-components';

4) js ํŒŒ์ผ ํ™•์žฅ์ž๋ช…์„ ts๋กœ ๋ณ€๊ฒฝ

์ •ํ™•ํžˆ๋Š” .js/.jsx ํŒŒ์ผ ํ™•์žฅ์ž๋ช…์„ ๋ชจ๋‘ .tsx๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ด์œ ๋Š” ์•„๋ž˜ ์˜ค๋ฅ˜ ๋ชจ์Œ์ง‘์—์„œ ์„ค๋ช…ํ•˜๋ ค ํ•œ๋‹ค.


2. ๋ฐœ์ƒ ์˜ค๋ฅ˜

์œ„์—์„œ ์„ค๋ช…ํ•œ ์˜ค๋ฅ˜ ์™ธ์—๋„ ๋งŽ์€ ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋‚ฌ๋Š”๋ฐ, ๊ทธ ์ค‘ ์ฃผ์š” ์˜ค๋ฅ˜์™€ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์„ ์ด์•ผ๊ธฐํ•˜๋ ค ํ•œ๋‹ค.

1) index.ts

index.js๋ฅผ index.ts๋กœ ํ™•์žฅ์ž๋ช…์„ ๋ฐ”๊พธ๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

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

์—๋Ÿฌ ๋ฉ”์‹œ์ง€์—์„œ๋Š” "typeof App์„ ์‚ฌ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?" ๋ผ๋Š” ์ œ์•ˆ์ด ๋‚˜์˜ค์ง€๋งŒ
ํ—ค๋งค๋‹ค ์ฐพ์€ ์ง„์งœ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ index.tsx๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

2) ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ ์˜ค๋ฅ˜

๊ธฐ์กด ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ props๋ฅผ ์‚ฌ์šฉํ•œ ๋ถ€๋ถ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

'props' ๋งค๊ฐœ ๋ณ€์ˆ˜์—๋Š” ์•”์‹œ์ ์œผ๋กœ 'any' ํ˜•์‹์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

props์— type์„ ๋ช…์‹œํ•ด ์ฃผ๋‹ˆ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.

3) ํ•จ์ˆ˜

onClick ํ”„๋กœํผํ‹ฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ํƒ€์ž…์ธ์ง€ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์—†์–ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
1) ํ•จ์ˆ˜ ์‚ฌ์šฉ ์‹œ์—๋Š” React.FC๋ผ๋Š” ํƒ€์ž…์„ ์‚ฌ์šฉ (๋‹ค๋งŒ ์ตœ๊ทผ ์ง€์–‘ํ•˜๋Š” ๋Š๋‚Œ)
2) ์ปดํฌ๋„ŒํŠธ์˜ ํ”„๋กœํผํ‹ฐ ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ • - onClick ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฒ„ํŠผ ์—˜๋ฆฌ๋จผํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜์ž„์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธ (React.MouseEventHandler<HTMLButtonElement>)

React.MouseEventHandler<HTMLButtonElement>์˜ ์˜๋ฏธ

  • React.MouseEventHandler : ์ด ํƒ€์ž…์€ React์—์„œ ์ œ๊ณตํ•˜๋Š” ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํƒ€์ž…์ž„์„ ์˜๋ฏธํ•จ
  • <HTMLButtonElement> : ํ•ด๋‹น ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์–ด๋–ค HTML ์—˜๋ฆฌ๋จผํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋ฒ„ํŠผ ์—˜๋ฆฌ๋จผํŠธ์— ์‚ฌ์šฉ๋˜๋ฏ€๋กœ HTMLButtonElement๋กœ ์ง€์ •

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

profile
โ˜๏ธ
post-custom-banner

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

comment-user-thumbnail
2023๋…„ 7์›” 19์ผ

๊ธ€ ์ž˜ ๋ดค์Šต๋‹ˆ๋‹ค, ๋งŽ์€ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ