[Typescript] ๊ธฐ์กด React + js ํ”„๋กœ์ ํŠธ ts๋กœ ๋ฐ”๊พธ๊ธฐ

Typescript

์ฐธ๊ณ  : https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html (Typescript ๊ณต์‹ ์‚ฌ์ดํŠธ)

 

๋ฐฐ์šฐ๋Š” ์ด์œ 

JS์—์„œ๋Š” Type์ด ๊ณ„์† ์ฒดํฌ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

1. ์ด๋Š” ์•”๋ฌต์  ํ˜•๋ณ€ํ™˜, hoisting, ๋ณต์žก์„ฑ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ฝ”๋“œ ์ƒ์˜ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฒ„๊ทธ๋ฅผ ์—†์• ๊ธฐ ์œ„ํ•ด typescript๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

hoisting : ๋Œ์–ด์˜ฌ๋ฆฐ๋‹ค๋Š” ๋œป. javascript์—์„œ ์„ ์–ธ๋ฌธ์„ ๋Œ์–ด์˜ฌ๋ ค ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ ์ˆœ์„œ์— ์ƒ๊ด€์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ .

typescript๋Š” ๋ณต์žกํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ฝ”๋“œ ์—†์ด ์ด๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

2. ํ˜‘์—… ์‹œ์—๋‚˜ ์ถ”ํ›„์— ๋ณธ์ธ์ด ์ง  ์ฝ”๋“œ๋ฅผ ๋ณด์•˜์„ ๋•Œ ํƒ€์ž…์ด ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ํ•˜๋‚˜์”ฉ ๋ณ€์ˆ˜๋ฅผ ์ฐ์–ด๋ณด๋Š” ์ˆ˜๋ฐ–์— ์—†๋‹ค. ์ด๋Ÿฌํ•œ ๋ถˆํŽธ์„ ๋ง‰๊ณ  ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ–‡ typescript๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

๊ธฐ์ดˆ

interface User {
  name: string;
  id: number;
}

const user: User = {
  name: "Hayes",
  id: 0,
};

์œ„์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜๋ฉด, user๋ผ๋Š” ๋ณ€์ˆ˜๋Š” User๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ํƒ€์ž…์ด ๋™์ผํ•ด์•ผํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

typescript๋Š” ๊ธฐ์กด์˜ javascript ํƒ€์ž…์—์„œ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ช‡๊ฐ€์ง€ ํƒ€์ž…์„ ๋” ๊ฐ–๋Š”๋‹ค. ๊ทธ๊ฒƒ์€ any(๋ญ๋“ ์ง€ ๊ฐ€๋Šฅ), unknown(ํƒ€์ž…์„ ์ •ํ•˜๋ผ๊ณ  ๋ช…์‹œ), never(์ด ํƒ€์ž…์€ ์ ˆ๋Œ€ ์•ˆ๋จ), void(undefined๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์ด ์—†๋Š” ํ•จ์ˆ˜)

 

Composing

๋ณต์žกํ•œ ํƒ€์ž…์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • Unions
  • Generics

 

Unions

string์ด๋‚˜ number ๋“ค์˜ ์„ธํŠธ๋ฅผ ํ•œ ๋ฒˆ์— ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

type WindowStates = "open" | "closed" | "minimized";

๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ type์„ ํ•ฉ์น  ์ˆ˜๋„ ์žˆ๋‹ค.

 

Generics

๋‹ค๋ฅธ ์–ธ์–ด์—์„œ์˜ ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ™์€ ์˜๋ฏธ์ด๋‹ค.

interface Backpack<Type>{
    add: (obj: Type) => void;
    get: () => Type;
}

declare const backpack: BackPack<string>;

 

Structural Type System

typescript์˜ ๊ธฐ์ดˆ ์›๋ฆฌ๋Š” type check ์‹œ ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ชจ์–‘์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์„ duck typing ๋˜๋Š” structural typing์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด dictionary ๋˜๋Š” map์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” structure๋Š” ์•ˆ์— key, value๊ฐ€ ๋ช‡ ์Œ์ด ์žˆ๋˜ ๋˜‘๊ฐ™์€ ๋ชจ์–‘์œผ๋กœ ๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

 

jsํŒŒ์ผ์„ tsํŒŒ์ผ๋กœ ๋ฐ”๊พธ๊ธฐ

jsํŒŒ์ผ์„ tsํŒŒ์ผ๋กœ ๋ฐ”๊พธ๋‹ˆ๊นŒ ์ƒ๊ธฐ๋Š” ๋ฌด์ˆ˜ํžˆ ๋งŽ์€ ์—๋Ÿฌ...

์•„๋ž˜์˜ ๊ณผ์ •์„ ๊ฑฐ์ณ์„œ ํ•ด๊ฒฐํ•˜์˜€๋‹ค.

 

์œ„์˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ .eslintrc ํŒŒ์ผ์„ settingํ•ด์ฃผ์—ˆ๋‹ค.

 

typescript๊ฐ€ ๊น”๋ ค์žˆ์ง€ ์•Š๋Œ€์„œ, typescript๋ฅผ ์„ค์น˜ํ•ด์ฃผ๋‹ˆ๊นŒ tsconfig.json ํŒŒ์ผ์ด ์ƒ๊ฒผ๋‹ค.

 

๊ฐ‘์ž๊ธฐ appTsConfig.compilerOptions[option] = true ์—๋Ÿฌ๊ฐ€ ๋‚˜์™€์„œ ํ•ด๊ฒฐํ•˜์˜€๋‹ค. tsconfig.json ํŒŒ์ผ์„ ์—†์• ๊ณ  ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ์‹์œผ๋กœ ๊ตฌ๋™ํ•˜๋ฉด ๋œ๋‹ค.

 

VScode์—์„œ react-jsx๊ฐ€ ์—†๋‹ค๊ณ , typescript๋ฅผ ๋” ๋†’์€ ๋ฒ„์ „์„ ์“ฐ๋ผํ•ด์„œ ํ•ด๊ฒฐํ•˜์˜€๋‹ค. VScode์—์„œ์˜ typescript ์‚ฌ์šฉ setting์„ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค.

 

An import path cannot end with a '.tsx' extension. Consider importing './App' instead. ์—๋Ÿฌ๊ฐ€ ๋– ์„œ ํ•ด๊ฒฐํ•˜์˜€๋‹ค. ๊ด€๋ จ rule์„ ๋น„ํ™œ์„ฑํ™” ์ฒ˜๋ฆฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

tsx๋กœ ํŒŒ์ผ ๋ชจ๋‘ ๋ณ€๊ฒฝํ•˜๋Š” ์ค‘ typescript ํŒŒ์ผ์˜ jsx๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ํ•ด๊ฒฐํ•˜์˜€๋‹ค. ํŒŒ์ผ ์ด๋ฆ„์„ .tsx ํ™•์žฅ์ž๋กœ ์ง€์ •ํ•˜๊ณ  tsconfig.json ํŒŒ์ผ์˜ jsx ์†์„ฑ์„ react-jsx๋กœ ํ•˜๋ฉด ๋œ๋‹ค.

๋ฐ˜์‘ํ˜•