๐Ÿ’ป typescript ๊ณต๋ถ€ํ•˜๊ธฐ

Kyla Kimยท2023๋…„ 7์›” 7์ผ

ํ”„์—”๊ฟˆ๋‚˜๋ฌด

๋ชฉ๋ก ๋ณด๊ธฐ
6/8

๐ŸŽต typescript๋ž€?

2012๋…„ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ๊ฐ€ ๋ฐœํ‘œํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(Javascript)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •์  ํƒ€์ž… ๋ฌธ๋ฒ•์„ ์ถ”๊ฐ€ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด

๐ŸŽต typescript์˜ ํŠน์ง•

1. ์ปดํŒŒ์ผ ์–ธ์–ด, ์ •์  ํƒ€์ž… ์–ธ์–ด
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋™์  ํƒ€์ž…์˜ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด๋กœ ๋Ÿฐํƒ€์ž„์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์— ๋ฐ˜ํ•ด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ •์  ํƒ€์ž…์˜ ์ปดํŒŒ์ผ ์–ธ์–ด์ด๋ฉฐ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ ๋˜๋Š” ๋ฐ”๋ฒจ(Babel)์„ ํ†ตํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

  • ์žฅ์  : ์ฝ”๋“œ ์ž‘์„ฑ ๋‹จ๊ณ„์—์„œ ํƒ€์ž…์„ ์ฒดํฌํ•ด ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฏธ๋ฆฌ ํƒ€์ž…์„ ๊ฒฐ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๋‹ค.
  • ๋‹จ์  : ์ฝ”๋“œ ์ž‘์„ฑ์‹œ ๋งค๋ฒˆ ํƒ€์ž…์„ ๊ฒฐ์ •ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒˆ๊ฑฐ๋กญ๊ณ  ์ฝ”๋“œ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•˜์—ฌ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค.

2. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์Šˆํผ์…‹(Superset)
ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์Šˆํผ์…‹, ์ฆ‰ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•์— ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๋ฌธ๋ฒ•์„ ์ถ”๊ฐ€ํ•œ ์–ธ์–ด์ด๋‹ค. ๋”ฐ๋ผ์„œ ์œ ํšจํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋Š” ํ™•์žฅ์ž๋ฅผ .js์—์„œ .ts๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

3. ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์›
ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ES6(ECMAScript6)์—์„œ ์ƒˆ๋กญ๊ฒŒ ์‚ฌ์šฉ๋œ ๋ฌธ๋ฒ•์„ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ์ƒ์†, ๋ชจ๋“ˆ ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจํ„ด์„ ์ œ๊ณตํ•œ๋‹ค.

typescript์˜ ์žฅ์ 

1. ๋†’์€ ์ˆ˜์ค€์˜ ์ฝ”๋“œ ํƒ์ƒ‰๊ณผ ๋””๋ฒ„๊น…
ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ฝ”๋“œ์— ๋ชฉ์ ์„ ๋ช…์‹œํ•˜๊ณ  ๋ชฉ์ ์— ๋งž์ง€ ์•Š๋Š” ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋“ค์—์„œ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ๋ฒ„๊ทธ๋ฅผ ์‚ฌ์ „์— ์ œ๊ฑฐํ•œ๋‹ค.
๋˜ํ•œ ์ฝ”๋“œ ์ž๋™์™„์„ฑ์ด๋‚˜ ์‹คํ–‰ ์ „ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜์—ฌ ์ž‘์—…๊ณผ ๋™์‹œ์— ๋””๋ฒ„๊น…์ด ๊ฐ€๋Šฅํ•ด ์ƒ์‚ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

2. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ˜ธํ™˜์„ฑ
ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ 100% ํ˜ธํ™˜๋œ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ & ๋ฐฑ์—”๋“œ ์–ด๋””๋“  ์•ฑ๊ณผ ์›น๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋™์ผํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์„œ๋ฒ„ ๋‹จ์—์„œ ๊ฐœ๋ฐœ์ด ์ด๋ฃจ์–ด์ง€๋Š” ๋ณต์žกํ•œ ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๋น›์„ ๋ฐœํ•œ๋‹ค.

3. ๊ฐ•๋ ฅํ•œ ์ƒํƒœ๊ณ„
ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ๊ทธ๋ฆฌ ์˜ค๋ž˜๋˜์ง€ ์•Š์€ ์–ธ์–ด์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ์ƒํƒœ๊ณ„๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์˜ VSCode๋ฅผ ๋น„๋กฏํ•ด ๊ฐ์ข… ์—๋””ํ„ฐ๊ฐ€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ด€๋ จ ๊ธฐ๋Šฅ๊ณผ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ง€์›ํ•œ๋‹ค.

4. ์ ์ง„์  ์ „ํ™˜ ๊ฐ€๋Šฅ
๊ธฐ์กด์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ์ „ํ™˜ํ•˜๋Š”๋ฐ ๋ถ€๋‹ด์ด ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด๋‚˜ ํŠน์ • ๊ธฐ๋Šฅ์—๋งŒ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋„์ž…ํ•จ์œผ๋กœ์จ ํ”„๋กœ์ ํŠธ๋ฅผ ์ ์ง„์ ์œผ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์—์„œ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉฐ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์™„์ „ํžˆ ๋ฐ”๋€Œ๋„๋ก ์ค€๋น„๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

typescript์˜ ๋‹จ์ (?)

1. ํ•˜์ง€๋งŒ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋Œ€ํ•œ ๋Ÿฌ๋‹ ์ปค๋ธŒ(Learning Curve)
2. ์ƒ๋Œ€์ ์œผ๋กœ ๋‚ฎ์€ ๊ฐ€๋…์„ฑ
3. ์ฝ”๋“œ๋Ÿ‰ ์ฆ๊ฐ€

ํ”„๋กœ์ ํŠธ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ• ์ง€ ๋ง์ง€ ๊ฒฐ์ •ํ•˜๋ฉด ๋œ๋‹ค.
ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ํฌ๊ณ  ๋ณต์žกํ• ์ˆ˜๋ก, ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์ค‘์š”ํ•œ ์žฅ๊ธฐ ํ”„๋กœ์ ํŠธ์ผ์ˆ˜๋ก ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ์ด์ ์ด ๋ถ€๊ฐ๋  ๊ฒƒ์ด๋‹ค.

๐ŸŽต typescript ์‚ฌ์šฉ๋ฒ•!

//๋ณ€์ˆ˜์— ํƒ€์ž… ์„ค์ •
let str: string = 'hi';
let num: number = 100;

let arr: Array = [1, 2, 3];
let arr2: number[] = [1, 2, 3];

let obj: object = {};
let obj2: { name: string, age: number} = {
โ€ƒname: 'hoho',
โ€ƒage: 22
};
//ํ•จ์ˆ˜์— ํƒ€์ž… ์„ค์ •
function add(a: number, b: number): number {
return a+b;
}
//์˜ต์…”๋„ ํŒŒ๋ผ๋ฏธํ„ฐ
function log(a: string, b?: string, c?: string) {
โ€ƒconsole.log(a);
}

์–ด ์ด๊ฑฐ ์ €๋ฒˆ์— ๋‚ด๊ฐ€ ํ–ˆ์„๋•Œ๋Š”

function add({a, b}:number){
  return a+b;
}

์ด๋ ‡๊ฒŒ ์•ˆํ•˜๋‹ˆ๊นŒ ์˜ค๋ฅ˜๋‚˜๋˜๋ฐ ใ…œใ…œ ์ด ์ฐจ์ด๋Š” ๋ญ์ง€?? -> props ์–ด์ฉŒ๊ตฌ ํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ์“ฐ๋ฉด ์ด๋ ‡๊ฒŒ ์“ฐ๋Š” ๊ฑด๊ฐ€..?

ํƒ€์ž… ์ข…๋ฅ˜

  • number
  • string
  • boolean
  • object : ์›์‹œํƒ€์ž…์ด ์•„๋‹Œ ๋‚˜๋จธ์ง€ ๋ชจ๋‘
  • array : ๋ฐฐ์—ด๋‚ด๋ถ€ ๋ฐ์ดํ„ฐํƒ€์ž…๋„ ์ง€์ • ๊ฐ€๋Šฅ :number[ ] or Array<number>
  • null
  • undefined
  • tuple : ๊ณ ์ •ํฌ๊ธฐ ๋ฐฐ์—ด ํ‘œํ˜„, ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์„ ํŠœํ”Œ์†์— ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.
  • enum : ์—ด๊ฑฐ
  • any : ๋ชจ๋“  ํƒ€์ž… ๋‹ด์„์ˆ˜ ์žˆ์Œ, ๋ฐฐ์—ด์† ๊ฐ’์˜ ํƒ€์ž…์„ ๋ชจ๋‘ ์•Œ์ง€ ๋ชปํ• ๋•Œ๋„ ์œ ์šฉ
  • void : any์˜ ๋ฐ˜๋Œ€ํƒ€์ž…, ๋ณดํ†ต ๋ฆฌํ„ด๊ฐ’ ํ‘œํ˜„์— ์‚ฌ์šฉํ•œ๋‹ค.
  • never : ์ ˆ๋Œ€ ๋ฐœ์ƒํ• ์ˆ˜ ์—†๋Š” ํƒ€์ž…. ์—๋Ÿฌ..

์ธํ„ฐํŽ˜์ด์Šค

์ธํ„ฐํŽ˜์ด์Šค๋Š” ํƒ€์ž…์„ ์ •์˜ํ•œ ๊ทœ์น™์„ ์˜๋ฏธํ•œ๋‹ค.
interface ๋ผ๋Š” ํ‚ค์›Œ๋“œ๋กœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค. ํ•จ์ˆ˜ ์„ ์–ธ์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ธ์ž์˜ ํƒ€์ž…๋„ ๋™์ผํ•˜๊ฒŒ ์ง€์ผœ์ค€๋‹ค.

ํšŒ์‚ฌ์—์„œ๋Š” Props ๋ผ๋Š” ๋ณ€์ˆ˜? ๋ช…๋ น์–ด?๋กœ ์‚ฌ์šฉํ•˜๋˜๋ฐ ํŒจํ‚ค์ง€์ธ์ค„! ์•„๋‹ˆ๋ฉด ํŒจํ‚ค์ง€์ค‘์— ํ•˜๋‚˜์ธ๊ฑด๊ฐ€? ์ข€ ๋” ์•Œ์•„๋ณด์ž

// interface๋ฅผ ํ†ตํ•œ ๊ฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ณ„ type์ง€์ •
interface Person {
  name : string;
  age : number;
}

// ์ธ์ž๋กœ ๋„˜๊ธธ object
const user = {
  name : '๋ฐ”๋น„',
  age :99,
}

// sayHi ํ•จ์ˆ˜ ์ •์˜, ๋งค๊ฐœ๋ณ€์ˆ˜์™€ type์„ ์ง€์ •ํ•œ๋‹ค.
// ๋งŒ์•ฝ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๊ฐœ๋ณ„ ๋ณ€์ˆ˜๋ผ๋ฉด
// (name : Person.name, age:Person.age):string
const sayHi = (user :Person): string => {
  return `๋‚˜๋Š” ${person.age}์‚ด ${pserson.name}๋‹ค~`
}

console.log(sayHi(user));
// '๋‚˜๋Š” 99์‚ด ๋ฐ”๋น„๋‹ค~'

๐ŸŽต Class

// Person ํด๋ž˜์Šค ์„ ์–ธ
class Person {
  // fullName์˜ type ์„ ์–ธ
  fullName : string;  
  
  constructor (firstName : string, lastName : string) {
	this.fullName = `${firstName} ${lastName}`;
  }
}

// Person ์ƒ์„ฑ์ž๋กœ man ์ƒ์„ฑ
const man = new Person('์‚ฌ๊ณผ', '๋ฐ”๋‚˜๋‚˜');


console.log(man.fullName) // fullname = ์‚ฌ๊ณผ ๋ฐ”๋‚˜๋‚˜

public & private

ํด๋ž˜์Šค ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’์„ ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ๊ฐ์ถ”๋ ค๋ฉด private ์†์„ฑ์„ ์ด์šฉํ•˜์ž

class Human {
  constructor(public name: string, private age: number) {
    this.age = age;
    this.name = name;
  }
}

const man = new Human('ํ™ฉํ™ฉ', 18);

const sayHi = (person: Human): string => {
  return `๋‚˜์ด๋Š”? ${person.age}?`;
};

console.log(sayHi(man));
// src/index.ts(28,52): error TS2341: Property 'age' is private and only accessible within class 'Human'.

// private ์„ค์ •ํ•œ ๊ฐ’์œผ๋กœ ์—๋Ÿฌ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๐ŸŽต ํ™•์žฅ์ž .ts์™€ .tsx ์˜ ์ฐจ์ด์ 

js์™€ jsx, ts์™€ tsx์˜ ์ฐจ์ด / jsx๋ฅผ js๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •

  • TS (TypeScript): TypeScript๋Š” JavaScript๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์ง€์›ํ•˜๋Š” JavaScript์˜ ์Šˆํผ์…‹์ด๋‹ค. TS๋Š” ๋Œ€๊ฐœ .ts ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • TSX (TypeScript with JSX): TSX๋Š” React์—์„œ UI๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” TypeScript์ด๋‹ค. React์—์„œ JSX๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ .tsx ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

++ ์ถ”๊ฐ€

  • JS ํŒŒ์ผ์€ ์ผ๋ฐ˜์ ์ธ JavaScript ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•œ๋‹ค. ํ•จ์ˆ˜, ๋ณ€์ˆ˜, ์ œ์–ด๋ฌธ ๋ฐ ๊ฐ์ฒด์™€ ๊ฐ™์€ JavaScript์˜ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ๋œ ํŒŒ์ผ์ด๋‹ค. JS ํŒŒ์ผ์€ React์—์„œ UI๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, JSX๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.

  • JSX ํŒŒ์ผ์€ HTML๊ณผ JavaScript๋ฅผ ํ˜ผํ•ฉํ•œ ๋ฌธ์„œ์ด๋‹ค. JSX ํŒŒ์ผ์—๋Š” JavaScript ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ, HTML ์š”์†Œ์™€ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ React์—์„œ UI๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, JSX์—์„œ๋Š” HTML ์š”์†Œ์™€ ์œ ์‚ฌํ•œ <div> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

JS์™€ JSX์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ JSX๊ฐ€ HTML๊ณผ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ React UI๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ์ ์ด๋‹ค. JSX๋Š” JavaScript ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜์ง€๋งŒ, HTML ์š”์†Œ์™€ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ React์—์„œ UI๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

  • ๋ธŒ๋ผ์šฐ์ €๋Š” JSX๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— JSX ์ฝ”๋“œ๋ฅผ JavaScript ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.
  • JSX๋ฅผ JavaScript(JS)๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์€ ๋ฐ”๋ฒจ(Babel)๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋œ๋‹ค.

๐ŸŽต ์ปดํŒŒ์ผ๋Ÿฌ

๐ŸŽต ํ•จ์ˆ˜ ์„ ์–ธ ๋ฐฉ์‹์˜ ์ฐจ์ด

๐ŸŽต ์šฉ์–ด ์ •๋ฆฌ

  • ์ •์ ํƒ€์ž…, ๋™์ ํƒ€์ž… : ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ํƒ€์ž…์€ ๊ณง ์ž๋ฃŒํ˜•์ด๋ผ๋Š” ๋ง์ด๋‹ค.
    ์ •์ ํƒ€์ž… ์–ธ์–ด vs ๋™์ ํƒ€์ž… ์–ธ์–ด

  • ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด : ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด(๊ณ ๊ธ‰์–ธ์–ด)๋ฅผ ์ปดํŒŒ์ผ ๋ณ€ํ™˜ ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด๋ฅผ ๋งํ•œ๋‹ค.
    ex) ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

  • ์ปดํŒŒ์ผ ์–ธ์–ด : ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ฑฐ์ณ์„œ ๊ธฐ๊ณ„์–ด๋กœ ๋ชจ๋‘ ๋ณ€ํ™˜๋˜์–ด ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด. (์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š์•„ ์†๋„๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๋น ๋ฅด๋‹ค.)
    ์ปดํŒŒ์ผ๋Ÿฌ(Complier)๋ž€?
    ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด(๊ณ ๊ธ‰์–ธ์–ด)๋ฅผ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ด ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜์‹œํ‚ค๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค.
    ex) ์†Œ์Šค์ฝ”๋“œ โ†’ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ์œผ๋กœ ๋ณ€ํ™˜

  • ๋Ÿฌ๋‹ ์ปค๋ธŒ(Learning Curve) : ํŠน์ • ๊ธฐ์ˆ  ๋˜๋Š” ์ง€์‹์„ ์‹ค์ œ ํ•„์š”ํ•œ ์—…๋ฌด์™€ ๊ฐ™์€ ํ™˜๊ฒฝ์—์„œ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋“œ๋Š” ํ•™์Šต ๋น„์šฉ์„ ์˜๋ฏธํ•˜๊ธฐ๋„ ํ•˜๋ฉฐ ํŠน์ • ๊ธฐ์ˆ ์„ ์Šต๋“ํ•  ๋•Œ์— ์ฒ˜์Œ์—๋Š” ํ•™์Šต ํšจ๊ณผ๊ฐ€ ๋”๋””๋‹ค๊ฐ€ ์–ด๋А ์ •๋„ ์ดํ•ด๋ฅผ ํ•˜๊ณ  ๋‚˜๋ฉด ๋น ๋ฅด๊ฒŒ ์Šต๋“ํ•˜๊ณ  ํ›„์—๋Š” ๋‹ค์‹œ ๋”๋ŽŒ์ง€๋Š” ๊ณก์„ ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ๋„ ํ•œ๋‹ค.
    [IT] ๋Ÿฌ๋‹์ปค๋ธŒ(Learning Curve) ๋ž€?

  • ์Šˆํผ์…‹ : ์ƒ์œ„ ํ™•์žฅ์ด๋ผ๋Š” ๋œป, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ด์™ธ์— ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋งŒ์˜ ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค๋“ฑ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจํ„ด์ด ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค

๐ŸŽˆ ์ธํ„ฐํŽ˜์ด์Šค

๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์— ํ™œ์šฉํ•œ ์ธํ„ฐํŽ˜์ด์Šค

var person: User = {
โ€ƒage: 30,
โ€ƒname: 'aa'
}

function getUser(user: User) {
โ€ƒconsole.log(user);
}

์ธ๋ฑ์‹ฑ

interface StringArray {
โ€ƒ[index: number]: string;
}

var arr2: StringArray = ['a', 'b', 'c'];
arr[0] = 10 //Error;

๋”•์…”๋„ˆ๋ฆฌ ํŒจํ„ด

interface StringRegexDictionary {
โ€ƒ[key: string]: RegExp
}

var obj: StringRegexDictionary = {
โ€ƒcssFile: /\.css$/,
โ€ƒjsFile: 'a' //Error
}

obj['cssFile'] = /\.css$/;
obj['jsFile'] = 'a' //Error

์ธํ„ฐํŽ˜์ด์Šค ํ™•์žฅ

interface Person{
โ€ƒname: string;
โ€ƒage: number;
}

interface User extends Person{
โ€ƒlanguage: string;
}

๐ŸŽˆ ์˜คํผ๋ ˆ์ดํ„ฐ

Union ํƒ€์ž…

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ OR ์—ฐ์‚ฐ์ž. Union ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•˜๋ฉด ๊ฐ ํƒ€์ž…์˜ ๊ณตํ†ต๋œ(๋ณด์žฅ๋œ)(?)์†์„ฑ์—๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค
function askSomeone(someone: Developer2 | Person) {
โ€ƒconsole.log(someone);
}

(๋งค๊ฐœ๋ณ€์ˆ˜ ์•ˆ์˜ | ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค)

Intersection ํƒ€์ž…

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ AND ์—ฐ์‚ฐ์ž. ๊ฐ๊ฐ์˜ ๋ชจ๋“  ํƒ€์ž…์ด ํฌํ•จ๋œ ๊ฐ์ฒด๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
function askSomeone(someone: Developer & Person) {
โ€ƒconsole.log(someone);
}

(๋งค๊ฐœ๋ณ€์ˆ˜ ์•ˆ์˜ & ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ํšŒ์‚ฌ์—์„œ ์ž‘์—…ํ•  ๋•Œ๋Š” &&๋ฅผ ์ผ๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ.. ๊ทธ๊ฒƒ๋„ ์กฐ๊ธˆ ๋” ๊ณต๋ถ€ํ•ด๋ณด๋„๋ก ํ•˜์ž)

๐ŸŽˆ ์ œ๋„ค๋ฆญ

ํ•œ๊ฐ€์ง€ ํƒ€์ž…๋ณด๋‹ค ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํƒ€์ž…์—์„œ ๋™์ž‘ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ œ๋„ค๋ฆญ์ด๋ž€ ํƒ€์ž…์„ ๋งˆ์น˜ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

function logText <T> (text: T):T {
โ€ƒreturn text;
}

logText<string>('aa');
logText<number>(100);

์ด๊ฒŒ ๋ญ์ง€

๐ŸŽˆ ํƒ€์ž… ์ถ”๋ก 

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๋Š” ๊ณผ์ •

var a = true;

a = 100; //Error

ํ•ด๋‹น ์ฝ”๋“œ๋Š” a ๋ณ€์ˆ˜๋ฅผ Boolean ํƒ€์ž…์œผ๋กœ ์ถ”๋ก ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Number ํƒ€์ž…์„ ํ• ๋‹นํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

Best Common Type(๊ฐ€์žฅ ์ ์ ˆํ•œ ํƒ€์ž…)

  • ๋ฐฐ์—ด์— ๋‹ด๊ธด ๊ฐ’๋“ค์„ ์ถ”๋ก ํ•˜์—ฌ Union ํƒ€์ž…์œผ๋กœ๋ฌถ์–ด๋‚˜๊ฐ€๋Š” ๊ฒƒ
var arr = [1, 2, true];

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ํ•ด๋‹น ์ฝ”๋“œ์˜ ํƒ€์ž…์„ Number | Boolean์œผ๋กœ ์ •์˜ํ•œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์™€ ์ œ๋„ค๋ฆญ์„ ์ด์šฉํ•œ ํƒ€์ž… ์ถ”๋ก  ๋ฐฉ์‹

interface Dropdown<T>{
โ€ƒvalue: T,
โ€ƒtext: 'String'
}

var items: Dropdown<boolean> {
โ€ƒvalue: true,
โ€ƒtext: 'aa'
}

๐ŸŽˆ ํƒ€์ž… ๋‹จ์–ธ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•ด์„ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ํ™•์‹คํ•œ ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด๋‹น ์ฝ”๋“œ์— ํƒ€์ž…์„ ์ง์ ‘ ์ง€์ •ํ•˜๋Š” ๊ฒƒ

var a;
a = 10;
a = 'string';
var b = a as string;

(as string ์„ ์˜๋ฏธํ•˜๋Š” ๋“ฏ ํ•˜๋‹ค)
Dom API ์กฐ์ž‘์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค

//ํƒ€์ž…์ถ”๋ก ์‹œ HTMLDivElementใ…ฃnull๋กœ ๋ฐ˜ํ™˜
var div = document.querySelector('div') as HTMLDivElement;
div.innerText;

์œ„์˜ ํƒ€์ž… ๋‹จ์–ธ์œผ๋กœ null์„ ๋Œ€๋น„ํ•œ ๋ถ„๊ธฐ๋ฌธ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
null์„ ๋Œ€๋น„ํ•œ ๋ถ„๊ธฐ๋ฌธ์„ ์ž‘์„ฑํ•ด์•ผ๋ผ? ๊ณต๋ถ€ํ• ๊ฑฐ ๊ฐœ๋งŽ๋‚ด์š”..

๐ŸŽˆ ํƒ€์ž… ํ˜ธํ™˜

๊ตฌ์กฐ์  ํƒ€์ดํ•‘

  • ์ฝ”๋“œ ๊ตฌ์กฐ ๊ด€์ ์—์„œ ํƒ€์ž…์ด ์„œ๋กœ ํ˜ธํ™˜๋˜๋Š”์ง€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ. ๊ตฌ์กฐ์ ์œผ๋กœ ๋” ํฐ ํƒ€์ž…์€ ์ž‘์€ ํƒ€์ž…์„ ํ˜ธํ™˜ํ•  ์ˆ˜ ์—†๋‹ค
interface Developer {
โ€ƒname: string;
โ€ƒage: string;
}
interface Person {
โ€ƒname: string;
}

var developer: Developer;
var person: Person;

developer = person; //Error
person = developer;

person์ด developer๋ณด๋‹ค ๋ฒ”์ฃผ๊ฐ€ ๋„“์œผ๋ฏ€๋กœ developer = person; ๊ตฌ๋ฌธ์ด ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ๊ฒƒ

๐ŸŽˆ type๊ณผ interface์˜ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ 

type๊ณผ interface์˜ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ 


References
1. ํ™œ์šฉ๋„๊ฐ€ ๋†’์•„์ง€๋Š” ์›น ํ”„๋ก ํŠธ์—”๋“œ ์–ธ์–ด, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ(TypeScript) - ์‚ผ์„ฑSDS ์ธ์‚ฌ์ดํŠธ ์ž„ํ˜œ์˜
2. Typescript #1 ์„ค์น˜์™€ ๊ธฐ๋ณธ์‚ฌ์šฉ๋ฒ• - hwang-eunji.log

profile
The only way of discovering the limits of the possible is to venture a little way past them into the impossible.

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