2 ๋ถ„ ์†Œ์š”

Typescript? ๐Ÿ”‘

Typescript : ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ํƒ€์ž…์„ ๋ถ€์—ฌํ•œ ์–ธ์–ด์ด๋‹ค.
  • MS์— ์˜ํ•ด ๊ฐœ๋ฐœ/๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๋Š” ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋‹ค.

  • ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์–ด๋ ต๊ณ  ๋ถˆํŽธํ•˜๋‹ค๋Š” ๋ถˆ๋งŒ์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค.

  • TypeScript๋Š” ES5์˜ Superset์ด๋ฏ€๋กœ ๊ธฐ์กด์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(ES5) ๋ฌธ๋ฒ•์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ES6์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Babel๊ณผ ๊ฐ™์€ ๋ณ„๋„ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ(Transpiler)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ES6์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ธฐ์กด์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„(ํ˜„์žฌ์˜ ๋ธŒ๋ผ์šฐ์ € ๋˜๋Š” Node.js)์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.


JS vs TS

  • JS๋Š” 5 - โ€˜3โ€™๊ณผ ๊ฐ™์€ Dynamic Typing์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • TS๋Š” ERROR MESSEGE๊ฐ€ ์ •ํ™•ํ•˜๋‹ค.


์„ค์น˜

  • nodejs ์„ค์น˜
  • npm install typescript
  • tsconfig.json ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ(์ปดํŒŒ์ผ์‹œ ์˜ต์…˜์„ค์ •ํ•˜๊ธฐ ์œ„ํ•จ)

tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs"
  }
}

commonjs๋Š” require ๋ฌธ๋ฒ•

es2015, esnext๋Š” import ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•จ

  • ๋ธŒ๋ผ์šฐ์ €๋Š” JS๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ์— TS -> JS๋กœ ๋ณ€ํ™˜์‹œ์ผœ ์ค˜์•ผํ•จ( ํ„ฐ๋ฏธ๋„์— tsc -w)


๋ฌธ๋ฒ•

let a: string = 'kk';

a = 3; // ERROR

'number' ํ˜•์‹์€ 'string' ํ˜•์‹์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

TS๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ• ๋•Œ ํƒ€์ž…์„ ์ง€์ •ํ•ด์ค€๋‹ค.

์ง€์ •ํ•ด์ค€ํƒ€์ž…์ด ์•„๋‹Œ ๋‹ค๋ฅธ ํƒ€์ž…์„ ๋„ฃ์œผ๋ฉด ERROR๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

(string, number, boolean, null, undefiend, bigint, [], {}, string[], { name? : string } ๋“ฑ๋“ฑ)

Union Type์ด๋ผ๊ณ  ํ•ด์„œ let a: string[] | number = 123; ์ด๋Ÿฐ์‹์œผ๋กœ ํƒ€์ž…์„ ์—ฌ๋Ÿฌ๊ฐœ ๋ฐ›์„์ˆ˜๋„์žˆ๋‹ค.

Tuple Type [number, boolean]

type MyType = string[] | { name: string };

let a: MyType = ['abc'];

ํƒ€์ž…์„ ์–ธ์ด ๊ธธ์–ด์ง€๋ฉด ์œ„์™€ ๊ฐ™์ด ํƒ€์ž…์„ ๋ณ€์ˆ˜์— ๋„ฃ์–ด์„œ ์‚ฌ์šฉํ•˜์—ฌ๋„ ๋œ๋‹ค.( ๋Œ€๋ฌธ์ž๋กœ ์‚ฌ์šฉํ•˜์ž. )

function abc(x: number): number {
  return x * 2;
}

abc('123'); // ERROR

ํ•จ์ˆ˜์—๋„ ํƒ€์ž…์„ ์–ธ์„ ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

arg๋ฅผ ์ˆซ์žํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•ด๋‘์—ˆ๊ณ , return ๋ถ€๋ถ„๋„ ์ˆซ์žํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•ด์ฃผ์—ˆ๋‹ค.

type Member = {
  [key: string]: string;
};

let a: Member = { abcdefg: 'asd' };

stringํƒ€์ž…์˜ ๋ชจ๋“  ํ‚ค๋Š” ํ‚ค๊ฐ’์œผ๋กœ stringํƒ€์ž…์„ ๊ฐ€์ง€๊ฒŒ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

class User {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
}

class๋ฌธ๋ฒ•์€ ์‚ด์ง ๋‹ค๋ฅด๋‹ค.



tsconfig.json

{
 "compilerOptions": {

  "target": "es5", // 'es3', 'es5', 'es2015', 'es2016', 'es2017','es2018', 'esnext' ๊ฐ€๋Šฅ
  "module": "commonjs", //๋ฌด์Šจ import ๋ฌธ๋ฒ• ์“ธ๊ฑด์ง€ 'commonjs', 'amd', 'es2015', 'esnext'
  "allowJs": true, // js ํŒŒ์ผ๋“ค ts์—์„œ importํ•ด์„œ ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€
  "checkJs": true, // ์ผ๋ฐ˜ js ํŒŒ์ผ์—์„œ๋„ ์—๋Ÿฌ์ฒดํฌ ์—ฌ๋ถ€
  "jsx": "preserve", // tsx ํŒŒ์ผ์„ jsx๋กœ ์–ด๋–ป๊ฒŒ ์ปดํŒŒ์ผํ•  ๊ฒƒ์ธ์ง€ 'preserve', 'react-native', 'react'
  "declaration": true, //์ปดํŒŒ์ผ์‹œ .d.ts ํŒŒ์ผ๋„ ์ž๋™์œผ๋กœ ํ•จ๊ป˜์ƒ์„ฑ (ํ˜„์žฌ์“ฐ๋Š” ๋ชจ๋“  ํƒ€์ž…์ด ์ •์˜๋œ ํŒŒ์ผ)
  "outFile": "./", //๋ชจ๋“  tsํŒŒ์ผ์„ jsํŒŒ์ผ ํ•˜๋‚˜๋กœ ์ปดํŒŒ์ผํ•ด์คŒ (module์ด none, amd, system์ผ ๋•Œ๋งŒ ๊ฐ€๋Šฅ)
  "outDir": "./", //jsํŒŒ์ผ ์•„์›ƒํ’‹ ๊ฒฝ๋กœ๋ฐ”๊พธ๊ธฐ
  "rootDir": "./", //๋ฃจํŠธ๊ฒฝ๋กœ ๋ฐ”๊พธ๊ธฐ (js ํŒŒ์ผ ์•„์›ƒํ’‹ ๊ฒฝ๋กœ์— ์˜ํ–ฅ์คŒ)
  "removeComments": true, //์ปดํŒŒ์ผ์‹œ ์ฃผ์„์ œ๊ฑฐ

  "strict": true, //strict ๊ด€๋ จ, noimplicit ์–ด์ฉŒ๊ตฌ ๊ด€๋ จ ๋ชจ๋“œ ์ „๋ถ€ ์ผœ๊ธฐ
  "noImplicitAny": true, //anyํƒ€์ž… ๊ธˆ์ง€ ์—ฌ๋ถ€
  "strictNullChecks": true, //null, undefined ํƒ€์ž…์— ์ด์ƒํ•œ ์ง“ ํ• ์‹œ ์—๋Ÿฌ๋‚ด๊ธฐ
  "strictFunctionTypes": true, //ํ•จ์ˆ˜ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์ฒดํฌ ๊ฐ•ํ•˜๊ฒŒ
  "strictPropertyInitialization": true, //class constructor ์ž‘์„ฑ์‹œ ํƒ€์ž…์ฒดํฌ ๊ฐ•ํ•˜๊ฒŒ
  "noImplicitThis": true, //this ํ‚ค์›Œ๋“œ๊ฐ€ any ํƒ€์ž…์ผ ๊ฒฝ์šฐ ์—๋Ÿฌ๋‚ด๊ธฐ
  "alwaysStrict": true, //์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ "use strict" ๋ชจ๋“œ ์ผœ๊ธฐ

  "noUnusedLocals": true, //์“ฐ์ง€์•Š๋Š” ์ง€์—ญ๋ณ€์ˆ˜ ์žˆ์œผ๋ฉด ์—๋Ÿฌ๋‚ด๊ธฐ
  "noUnusedParameters": true, //์“ฐ์ง€์•Š๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ์žˆ์œผ๋ฉด ์—๋Ÿฌ๋‚ด๊ธฐ
  "noImplicitReturns": true, //ํ•จ์ˆ˜์—์„œ return ๋นผ๋จน์œผ๋ฉด ์—๋Ÿฌ๋‚ด๊ธฐ
  "noFallthroughCasesInSwitch": true, //switch๋ฌธ ์ด์ƒํ•˜๋ฉด ์—๋Ÿฌ๋‚ด๊ธฐ
 }
}

์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค~

์—…๋ฐ์ดํŠธ: