๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“š FrontEnd -Study/TypeScript

[typescript ์—ด๊ฑฐํ˜•,์ธํ„ฐํŽ˜์ด์Šค,type,class]

by ChaeLOTUS 2023. 5. 31.
728x90

์—ด๊ฑฐํ˜•

enum NumberColor  {
  RED = 0,
  GREEN = 1,
  BLUE = 2,
};

enum StringColor {
  RED =  'red',
  GREEN = 'green',
  BLUE = 'blue',
};

 

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

// Todo ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
interface Todo {
  id: number;
  content: string;
  isDone: boolean;
}
// Todo ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํƒ€์ž…์œผ๋กœ ๋ฐ›๋Š” todos๋ฅผ ์™„์„ฑํ•ฉ๋‹ˆ๋‹ค.
let todos: Todo[] = [];

// Todo ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํƒ€์ž…์œผ๋กœ ๋ฐ›๋Š” addTodo๋ฅผ ์™„์„ฑํ•ฉ๋‹ˆ๋‹ค.
function addTodo(todo: Todo) {
  todos = [...todos, todo];
}

// Todo ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํƒ€์ž…์œผ๋กœ ๋ฐ›๋Š” newTodo๋ฅผ ์™„์„ฑํ•ฉ๋‹ˆ๋‹ค.
const newTodo: Todo = {
  id: 1,
  content: 'learn typescript',
  isDone: false,
};

addTodo(newTodo);

console.log(todos);

 

์ธํ„ฐํŽ˜์ด์Šค ์ƒ์†

interface FoodStuff {
    name: string;
}

interface FoodAmount {
    amount: number;
}

interface FoodFreshness extends FoodStuff, FoodAmount {
	   isFreshed: boolean;
}

const food = {} as FoodFreshness;

food.name = "egg";
food.amount = 2;
food.isFreshed = true;

 

const food = {} as FoodFreshness;

์ด ์ฝ”๋“œ๋Š” ํƒ€์ž… ๋‹จ์–ธ(type assertion)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜ food๋ฅผ FoodFreshness ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

ํƒ€์ž… ๋‹จ์–ธ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ "๋‚˜๋Š” ์ด ๋ณ€์ˆ˜๊ฐ€ ํŠน์ • ํƒ€์ž…์ด๋‹ค"๋ผ๊ณ  ํ™•์‹ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

์œ„์˜ ์ฝ”๋“œ์—์„œ๋Š” ๋นˆ ๊ฐ์ฒด {}๋ฅผ FoodFreshness ํƒ€์ž…์œผ๋กœ ๋‹จ์–ธํ•˜๊ณ  ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋นˆ ๊ฐ์ฒด์—๋Š” FoodFreshness ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ ํ”„๋กœํผํ‹ฐ๋“ค์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋‚˜์ค‘์— ํ”„๋กœํผํ‹ฐ๋“ค์„ ์ถ”๊ฐ€ํ•ด๋„ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋ฅผ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํƒ€์ž… ๋‹จ์–ธ์€ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

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

//Student ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
interface Student extends User {
  gradle: number;
}

//Student ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ›๋Š” kimcoding์„ ์™„์„ฑํ•ฉ๋‹ˆ๋‹ค.
//kimcoding์˜ ์ด๋ฆ„์€ ๊น€์ฝ”๋”ฉ์ด๊ณ , ๋‚˜์ด๋Š” 20์„ธ์ด๋ฉฐ, ํ•™๋…„์€ 1์ž…๋‹ˆ๋‹ค.
const kimcoding: Student = { name: '๊น€์ฝ”๋”ฉ', age: 20, gradle: 1 };

console.log(kimcoding);
interface Color {
  name: string;
  brightness: number;
}

interface ClothesType {
  kind: string;
  length: number;
}

//Closet ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
interface Closet extends Color, ClothesType {
  season: string;
}

//Closet ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ›๋Š” skirt๋ฅผ ์™„์„ฑํ•ฉ๋‹ˆ๋‹ค.
//skirt๋Š” ๋…ธ๋ž€์ƒ‰์ด๋ฉฐ, ๋ฐ๊ธฐ๋Š” 0์ด๊ณ , ์ข…๋ฅ˜๋Š” ์น˜๋งˆ์ด๋ฉฐ ๊ธธ์ด๋Š” 5 ์ •๋„๋กœ ์ค‘๊ฐ„์ด๋ฉฐ ์—ฌ๋ฆ„์šฉ์ž…๋‹ˆ๋‹ค.
const skirt: Closet = {
  name: 'skirt',
  brightness: 0,
  kind: '์น˜๋งˆ',
  length: 5,
  season: '์—ฌ๋ฆ„',
};

console.log(skirt);

 

 

ํƒ€์ž… ๋ณ„์นญ(Type Aliases)

: ํƒ€์ž… ๋ณ„์นญ(Type Aliases)์€ ํƒ€์ž…์˜ ์ƒˆ๋กœ์šด ์ด๋ฆ„์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. 

(์ƒˆ๋กœ์šด ์ด๋ฆ„์œผ๋กœ ๊ธฐ์กด์˜ ํƒ€์ž…์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ)

ํƒ€์ž… ๋ณ„์นญ์„ ์ด์šฉํ•˜์—ฌ ํƒ€์ž…์˜ ์ƒˆ๋กœ์šด ์ด๋ฆ„์„ ๋งŒ๋“ค ๋•Œ ํ‚ค์›Œ๋“œ type์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑํ•œ๋‹ค.

 

 

์ธํ„ฐํŽ˜์ด์Šค vs ํƒ€์ž… ๋ณ„์นญ

: ํƒ€์ž… ๋ณ„์นญ ๋˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ฐ™์€ ํŠน์ง•์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ธํ„ฐํŽ˜์ด์Šค์˜ ์—ญํ• ์„ ํƒ€์ž… ๋ณ„์นญ์ด ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์™€ ํƒ€์ž… ๋ณ„์นญ์—๋Š” ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

type Person = {
    name: string;
    age: number;
}

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

let kimcoding: Person = {
    name: '๊น€์ฝ”๋”ฉ',
    age: 30,
}

let coding: User = {
    name: '๊น€์ฝ”๋”ฉ',
    age: 30,
}

๊ฐ๊ฐ ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ ค๋ณด๋ฉด type์œผ๋กœ ์„ ์–ธํ•œ kimcoding์€ Person ํƒ€์ž… ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ณด์ด๊ณ 

๋ฐ˜๋ฉด interface๋กœ ์„ ์–ธํ•œ coding์€ User ๋‚ด๋ถ€์— ์–ด๋–ค ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋Š”์ง€ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.

 

๋”ฐ๋ผ์„œ ํƒ€์ž… ๋ณ„์นญ์œผ๋กœ ์ •์˜ํ•œ ํƒ€์ž…์œผ๋กœ ์ž‘์„ฑํ•  ์‹œ์—๋Š” ์กฐ๊ธˆ ๋” ํŽธํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ํƒ€์ž…๋ณ„์นญ์œผ๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋Š” extends๋กœ ํ™•์žฅํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ„ฐํŽ˜์ด์Šค๋Š” ๊ธฐ์กด์˜ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ํƒ€์ž… ๋ณ„์นญ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ํƒ€์ž… ๋‘˜ ๋‹ค ์ƒ์†ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์œ ์—ฐํ•œ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์œ„ํ•ด์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋งŒ๋“ค์–ด์„œ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

 

type Todo = {
  id: number;
  title: string;
  isDone: boolean;
};
//Todo ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
const show: Todo = {
  id: 1,
  title: 'lotus',
  isDone: true,
};

//Todo ํƒ€์ž…์„ ์‚ฌ์šฉํ•œ ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅํ•ด๋ด…๋‹ˆ๋‹ค.
function getTodo(todo: Todo) {
  console.log(todo);
}

getTodo(show);

 

 

 


 

 

 

ํƒ€์ž… ์ถ”๋ก (Type Inference)

: TypeScript๋Š” ํƒ€์ž… ์ถ”๋ก (Type Inference)์ด๋ผ๋Š” ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ฝ”๋“œ ์ž‘์„ฑ์„ ๋„์™€์ค€๋‹ค.

 

ํƒ€์ž… ์ถ”๋ก (Type Inference)์€ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜์˜ ํƒ€์ž…์„ ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ TypeScript๊ฐ€ ์ž๋™์œผ๋กœ ์œ ์ถ”ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

let isNumber = 123;

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” isNumber์˜ ํƒ€์ž…์„ ์ž๋™์œผ๋กœ ์ˆซ์ž(Number)๋กœ ์ถ”๋ก ํ•œ๋‹ค.

 

 

์ตœ์  ๊ณตํ†ต ํƒ€์ž…(Best common type)

let x = [0, 1, null];

 x ํƒ€์ž…์„ ์ถ”๋ก ํ•˜๋ ค๋ฉด ๊ฐ ๋ฐฐ์—ด ์š”์†Œ์˜ ํƒ€์ž…์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฐฐ์—ด์˜ ํƒ€์ž…์„ ๊ณ ๋ฅผ ์ˆ˜ ์žˆ๋Š” ํ›„๋ณด๊ฐ€ number์™€ null์ด๋‹ค.

์ตœ์  ๊ณตํ†ต ํƒ€์ž… ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ ํ›„๋ณด์˜ ํƒ€์ž…์„ ๊ณ ๋ คํ•˜์—ฌ, ๋ชจ๋“  ํ›„๋ณด์˜ ํƒ€์ž…์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ์„ ํƒํ•œ๋‹ค.

 

 

 

๋ฌธ๋งฅ์ƒ์˜ ํƒ€์ดํ•‘(Contextual Typing)

๋˜ ํ•˜๋‚˜์˜ ํƒ€์ž…์˜ ์ถ”๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌธ๋งฅ์ƒ์œผ๋กœ ํƒ€์ž…์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ฌธ๋งฅ์ƒ์˜ ํƒ€์ดํ•‘(ํƒ€์ž… ๊ฒฐ์ •)์€ ์ฝ”๋“œ์˜ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ผ์–ด๋‚œ๋‹ค.

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

๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์„ ์ง€์ •ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ, ๋งŒ์•ฝ a์™€ b๊ฐ€ ๋ชจ๋‘ number ํƒ€์ž…์ด๋ผ๋ฉด, add ํ•จ์ˆ˜ ๋ฐ˜ํ™˜๊ฐ’๋„ numberํƒ€์ž…์œผ๋กœ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

ํด๋ž˜์Šค(Class)

JavaScript์˜ ํด๋ž˜์Šค

๋”๋ณด๊ธฐ
class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  
  greet() {
    console.log(`์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ ${this.name}์ด๊ณ , ${this.age}์‚ด ์ž…๋‹ˆ๋‹ค.`);
  }
}

 

TypeScript์˜ ํด๋ž˜์Šค

๋”๋ณด๊ธฐ
class Person {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  greet(): void {
    console.log(`์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ ${this.name}์ด๊ณ , ${this.age}์‚ด ์ž…๋‹ˆ๋‹ค.`);
  }
}

 

javascript์™€์˜ ์ฐจ์ด์ ์€ TypeScript์—์„œ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ, constructor๋ฅผ ์ด์šฉํ•˜์—ฌ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฉค๋ฒ„๋“ค์€ ์ „๋ถ€ ์ƒ๋‹จ์—์„œ ์ •์˜๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค. ๋˜ํ•œ contructor ๋‚ด ์ธ์ž๋กœ ๋ฐ›์„ ๋•Œ๋„ ์ •ํ™•ํžˆ ํƒ€์ž…์„ ๋ช…์‹œํ•ด ์ค˜์•ผ ํ•œ๋‹ค.

 

 

ํด๋ž˜์Šค์™€ ์ƒ์†(Inheritance)

: TypeScript์˜ ํด๋ž˜์Šค(class)๋Š” ์ธํ„ฐํŽ˜์ด์Šค(interface)์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ธฐ์กด์— ์กด์žฌํ•˜๋˜ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ํ™•์žฅํ•˜์—ฌ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ๋„ extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์†ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

class Animal {
    move(distanceInMeters: number): void {
        console.log(`${distanceInMeters}m ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.`);
    }
}

class Dog extends Animal {
    speak(): void {
        console.log("๋ฉ๋ฉ!");
    }
}

const dog = new Dog();
dog.move(10);
dog.speak();

 

 

public, private ํ‚ค์›Œ๋“œ

๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ž˜์Šค ๋‚ด์— ์„ ์–ธ๋œ ๋ฉค๋ฒ„๋Š” ์™ธ๋ถ€๋กœ ๊ณต๊ฐœ๋˜๋Š” ๊ฒƒ์ด ๋””ํดํŠธ ๊ฐ’์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œ์‹œํ•ด์•ผ ํ•  ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

class Person {
  public name: string;
  public age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  greet(): void {
    console.log(`์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ ${this.name}์ด๊ณ , ${this.age}์‚ด ์ž…๋‹ˆ๋‹ค.`);
  }
}

์™ธ๋ถ€์— ๋“œ๋Ÿฌ๋‚ด์ง€ ์•Š์„ ๋ฉค๋ฒ„๊ฐ€ ์žˆ๋‹ค๋ฉด private๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

class Person {
  public name: string;
  private age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  greet(): void {
    console.log(`์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ ${this.name}์ด๊ณ , ${this.age}์‚ด ์ž…๋‹ˆ๋‹ค.`);
  }
}

 

 

readonly ํ‚ค์›Œ๋“œ

readonly ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ฝ๊ธฐ ์ „์šฉ ํ”„๋กœํผํ‹ฐ๋“ค์€ ์„ ์–ธ ๋˜๋Š” ์ƒ์„ฑ์ž์—์„œ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•œ๋‹ค.

class Mydog {
    readonly name: string;
    constructor(theName: string) {
        this.name = theName;
    }
}
let spooky = new Mydog("์Šคํ‘ธํ‚ค");
spooky.name = "๋ฉ‹์ง„ ์Šคํ‘ธํ‚ค"; // ์—๋Ÿฌ

์œ„์˜ ์ฝ”๋“œ๋Š” name์„ readonly ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์—  ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

728x90

๋Œ“๊ธ€