let's get IT with DAVINA ๐Ÿ’ป

TypeScript(apply) ๋ณธ๋ฌธ

DEV_IN/TypeScript

TypeScript(apply)

๋‹ค๋นˆ์น˜์ฝ”๋“œ๐Ÿ’Ž 2023. 2. 17. 19:08

1. package.json ์ดˆ๊ธฐํ™”

//terminal
mkdir typechain
code typechain

//vsc์—ด๋ฆฐ๋‹ค

//typechain/ํ†ตํ•ฉterminal
npm init-y

- package.json

package.jsonํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋ฉด, 

"main": "index.js" ์—†์• ๊ณ , scripts ์•ˆ์— test๋ถ€๋ถ„ ์—†์• ๊ณ  ์ˆ˜์ • ใ„ฑใ„ฑ

{
    "name": "typechain",
    "version": "1.0.0",
    "description": "",
    "scripts": {
        "build": "tsc",
        "dev": "nodemon --exec ts-node src/index.ts", //srcํด๋” ์•ˆ์˜ index.tsํŒŒ์ผ์˜ ์ฝ”๋งจ๋“œ๋“ค์„ ์ž๋™ ์‹คํ–‰์‹œ์ผœ์คŒ
        "start": "node build/index.js" //start๋ฅผ ์‹คํ–‰ํ•˜๋ฉด build ํด๋” ์•ˆ์˜ index.js ํŒŒ์ผ์„ ์‹คํ–‰
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "devDependencies": {
        "ts-node": "^10.9.1",
        "typescript": "^4.9.5"
    },
    "dependencies": {
        "nodemon": "^2.0.20"
    }
}

2. typescript ์„ค์น˜

//ํ†ตํ•ฉterminal๋กœ ๋Œ์•„์™€์„œ
npm i -D typescript //ts๊ฐ€ devDependencies์— ์„ค์น˜๋จ (์ƒ๊ธฐ package.json ์ฐธ๊ณ )

touch tsconfig.json //vs code์—๊ฒŒ ์šฐ๋ฆฌ๊ฐ€ ts๋กœ ์ž‘์—…ํ•œ๋‹ค๋Š”๊ฒƒ์„ ์•Œ๋ ค์คŒ "ํŒŒ์ผ๋ช…์€ ๋ฌด์กฐ๊ฑด tsconfig.json"

npm run build && npm start → ๊ณ„์† ์ด ์ž‘์—…์„ ๋ฐ˜๋ณตํ•˜๋ฉด ๋น„ํšจ์œจ์ ์ด๊ณ  ๊ท€์ฐฎ๊ฒ ์ฐŒ!?!?

npm i -D ts-node
npm i nodemon
โญ๏ธ ts-node
๋นŒ๋“œ/์ปดํŒŒ์ผ ํ•  ํ•„์š” ์—†์ด TS ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
ts-node๋Š” Node.js์šฉ TypeScript ์‹คํ–‰ ์—”์ง„ ๋ฐ REPL์ž…๋‹ˆ๋‹ค. JIT๋Š” TypeScript๋ฅผ JavaScript๋กœ ๋ณ€ํ™˜ํ•˜๋ฏ€๋กœ ์‚ฌ์ „ ์ปดํŒŒ์ผ ์—†์ด Node.js์—์„œ TypeScript๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โญ๏ธ nodemon
์„œ๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•  ํ•„์š” ์—†์ด, command๋ฅผ auto-refresh ์‹œ์ผœ์ค๋‹ˆ๋‹ค.

3. tsconfig.json ํŒŒ์ผ ์„ค์ •

include

  • tsํŒŒ์ผ๋“ค์ด ์–ด๋Š ํด๋” ์•ˆ์— ์œ„์น˜ํ•œ์ง€ ์ง€์ผœ๋ณด๊ธฐ๐Ÿ‘€ ๐Ÿ‘€

compilerOptions

{
    "include": ["src"], //tsํŒŒ์ผ๋“ค์ด ์–ด๋””์— ์žˆ์–ด? ์ง€์ผœ๋ด
    "compilerOptions": {
        "outDir": "build", //ts->js๋กœ ์ปดํŒŒ์ผ๋œ๊ฑด ์–ด๋””์—๋‹ค ์ €์žฅํ• ๊บผ์•ผ?
        "target": "ES6", //js๋กœ ์ปดํŒŒ์ผ๋  ๋•Œ ์–ด๋–ค ๋ฒ„์ „์„ ์‚ฌ์šฉํ• ์ง€ ์„ ํƒ ๊ฐ€๋Šฅ (ES6 ์ ค ์ถ”์ฒœ)
		"lib": ["ES6", "dom"], //ES6์„ ์ง€์›ํ•˜๋Š” ์„œ๋ฒ„ & DOM, ์ฆ‰ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ๊บผ์•ผ ex)DOM: window, document, localStorage ๋“ฑ๋“ฑ..
		"strict" : true, //strict๋ชจ๋“œ ์‹คํ–‰
		"allowJs": true, //js์ฝ”๋“œ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ๋จ
        "esModuleInterop": true,
        "module": "CommonJS"
    }
}
  • outDir
    • ts→js๋กœ ์ปดํŒŒ์ผ๋œ ํŒŒ์ผ ์ €์žฅ ์œ„์น˜ ์„ ํƒ โœ“
  • target
    • ts→js๋กœ ์ปดํŒŒ์ผ ๋  ๋•Œ, ์–ด๋–ค ๋ฒ„์ „์„ ์‚ฌ์šฉํ• ๊ป€์ง€ ์„ ํƒ โœ“
โญ๏ธ TARGET
์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ชจ๋“  ES6 ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋ฏ€๋กœ ES6๋Š” ์ข‹์€ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ์ด์ „ ํ™˜๊ฒฝ์— ๋ฐฐํฌ๋œ ๊ฒฝ์šฐ ๋” ๋‚ฎ์€ target์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์ตœ์‹  ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ์‹คํ–‰์ด ๋ณด์žฅ๋˜๋Š” ๊ฒฝ์šฐ ๋” ๋†’์€ target์„ ์„ค์ •ํ•˜๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ex) ํ™”์‚ดํ‘œ ํ•จ์ˆ˜() => this๋Š” ES5 ์ดํ•˜์ด๋ฉด ํ•จ์ˆ˜ ํ‘œํ˜„์‹์œผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.

ํŠน๋ณ„ํ•œ ESNext ๊ฐ’์€ TypeScript ๋ฒ„์ „์ด ์ง€์›ํ•˜๋Š” ๊ฐ€์žฅ ๋†’์€ ๋ฒ„์ „์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด ์„ค์ •์€ ๋‹ค๋ฅธ TypeScript ๋ฒ„์ „ ๊ฐ„์— ๋™์ผํ•œ ์˜๋ฏธ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

- ES3 ๊ธฐ์ค€

- ES6 ๊ธฐ์ค€

  • lib
    • js ์ฝ”๋“œ๊ฐ€ ์–ด๋””์—์„œ ๋™์ž‘ํ• ์ง€ ์•Œ๋ ค์คŒ โœ“
    • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—๊ฒŒ ์–ด๋–ค API๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์–ด๋–ค ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ง€๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (target ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์ด ๋ฌด์—‡์ธ์ง€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.)
    • ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์ง€๋กฑ! ํŽธ๋ฆฌํŽธ๋ฆฌ!
    • TS๋Š” Math์ฒ˜๋Ÿผ ๊ธฐ๋ณธ์ ์œผ๋กœ ํฌํ•จ๋œ JS API์— ๋Œ€ํ•œ ํƒ€์ž… ์ •์˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • strict
    • ๋ชจ๋“  ์—„๊ฒฉํ•œ ํƒ€์ž… ๊ฒ€์‚ฌ ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘Œ
    • ex1) ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋งŒ๋“ค์–ด์ง„ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ–ˆ์„ ๋•Œ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์— ๊ทธ ํŒจํ‚ค์ง€์˜ ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•
    • strict ํ”Œ๋ž˜๊ทธ๋Š” ํ”„๋กœ๊ทธ๋žจ ์ •ํ™•์„ฑ์„ ๋” ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋ณด์žฅํ•˜๋Š” ๊ด‘๋ฒ”์œ„ํ•œ ํƒ€์ž… ๊ฒ€์‚ฌ ๋™์ž‘์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
    • strict:true๋ฅผ ํ†ตํ•ด Declaration Files๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ๋„ ์—๋Ÿฌ๋ฅผ ๋„์›Œ์ค๋‹ˆ๋‹ค. โ›”๏ธ
โญ๏ธ Declaration
⇒ How we explain to TS the types of NodeJS
⇒ ๋ณดํ†ต d.ts ํŒŒ์ผ๋“ค์€ ์นœ์ ˆํ•œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‹ค ํƒ€์ž…์„ ์ง€์ •/์ •์˜ํ•ด์ค˜์„œ ์šฐ๋ฆฌ๊ฐ€ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๋Š”๊ฑฐ์ž„!

  • allowJs 
    • TSํŒŒ์ผ์ด JSํŒŒ์ผ์˜ ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ์šฉํ•ด์ค๋‹ˆ๋‹ค. ๐Ÿ‘Œ
    • ex2) ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ TS๋ณดํ˜ธ์žฅ์น˜๋กœ ๋ณดํ˜ธ๋ฐ›๊ณ  ์‹ถ์„ ๋•Œ (JSํŒŒ์ผ์„ ์•ˆ๊ฑด๋“œ๋ฆฌ๋ฉฐ..)
1. TS์—์„œ JSํŒŒ์ผ importํ•˜๊ธฐ ์œ„ํ•ด (์ฝ์–ด์˜ค๊ธฐ ์œ„ํ•ด) allowJs:true๋กœ ์„ค์ •!
2. TS์˜ ๋ณดํ˜ธ์žฅ์น˜๋กœ ๋ณดํ˜ธ๋ฐ›๊ณ  ์‹ถ์€ JSํŒŒ์ผ์—์„œ ํ•ด๋‹น ๋ถ€๋ถ„์— ์ฃผ์„! @ts-check
3. /** */ + ENTER ⇒ JSDoc comment ์ž‘์„ฑ (์—ฌ๊ธฐ์„œ ํ•ด๋‹น d.tsํŒŒ์ผ๋“ค ์ฒ˜๋Ÿผ type๋“ค ์ง€์ •)

⇒ comment์ผ ๋ฟ์ด๋‹ˆ๊นŒ JS์ฝ”๋“œ์— ์•„๋ฌด ์ง€์žฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ, type์„ ์ง€์ •ํ•ด์ค˜์„œ typeScript์˜ ๋ณดํ˜ธ์žฅ์น˜๋„ ๋ฐ›์•„!! very nice~~๐Ÿคฉ

โ“ difference between import {} from “./file” VS import {} from “file”
⇒ import {} from "file" is for a module you install with npm.
"./file" is for a file you create.
  • esModuleInterop
    • CommonJS ๋ชจ๋“ˆ์„ ES6 ๋ชจ๋“ˆ ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
    • ES6 ๋ชจ๋“ˆ ์‚ฌ์–‘์„ ์ค€์ˆ˜ํ•˜์—ฌ CommonJS๋ชจ๋“ˆ์„ ์ •์ƒ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

 

'DEV_IN > TypeScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๊ธฐ์กด React์— TypeScript ์ ์šฉํ•˜๊ธฐ  (4) 2023.03.03
โ›”๏ธ ์ž์ฃผ ๋ณผ ์ˆ˜ ์žˆ๋Š” Errors  (0) 2023.02.17
TypeScript(Interface)  (4) 2023.02.16
TypeScript(Classes)  (4) 2023.02.12
TypeScript (Function)  (3) 2023.02.09
Comments