Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

pgg-dev

[TypeScript] Interface, Type Alias 본문

TypeScript

[TypeScript] Interface, Type Alias

pgg-dev 2020. 3. 28. 17:16

Interface

클래스 또는 객체를 위한 타입을 지정할때 사용하는 문법

 

클래스를 interface 로 사용할 때

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
interface Shape {
  getArea(): number;
  // Shape interface 에는 getArea 라는 함수가 꼭 있어야 하며, 반환값은 숫자이다.
}
 
class Circle implements Shape {
  // implements 키워드를 사용하면, 해당 클래스가 Shape interface 의 조건을 충족해야한다.
 
  radius: number;
 
  constructor(radius: number) {
    this.radius = radius;
  }
 
  getArea() {
    return this.radius * this.radius * Math.PI;
  }
}
 
class Rectangle implements Shape {
  width: number;
  height: number;
 
  constructor(width: number, height: number) {
    this.width = width;
    this.height = height;
  }
 
  getArea() {
    return this.width * this.height;
  }
}
 
function getRectangle(rectangle: Rectangle) {
  //파라미터를 받아와야할 경우
  return console.log(rectangle.getArea());
}
getRectangle(new Rectangle(35));
 
const circle = new Circle(5);
const rectangle = new Rectangle(25);
const shapes: Shape[] = [circle, rectangle];
 
shapes.forEach(shape => {
  console.log(shape.getArea());
});
 

컴파일

 

기존 코드에서

1
2
3
4
5
6
7
  width: number;
  height: number;
 
  constructor(width: number, height: number) {
    this.width = width;
    this.height = height;
 }

이런식으로 width, height 멤버 변수를 선언한 다음에 constructor 에서 해당 값들을 하나 하나 설정했다,

타입스크립트에서는 constructor 의 파라미터 쪽에 public 또는 private 를 사용하면 직접 하나하나 설정해주는 작업을 생략해줄 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
interface Shape {
  getArea(): number;
  // Shape interface 에는 getArea 라는 함수가 꼭 있어야 하며, 반환값은 숫자이다.
}
 
class Circle implements Shape {
  // implements 키워드를 사용하면, 해당 클래스가 Shape interface 의 조건을 충족해야한다.
 
  constructor(public radius: number) {
    this.radius = radius;
  }
 
  getArea() {
    return this.radius * this.radius * Math.PI;
  }
}
 
class Rectangle implements Shape {
  constructor(private width: number, private height: number) {
    this.width = width;
    this.height = height;
  }
 
  getArea() {
    return this.width * this.height;
  }
}
 
const circle = new Circle(5);
const rectangle = new Rectangle(105);
 
console.log(circle.radius);
console.log(rectangle.width);
 
const shapes: Shape[] = [new Circle(5), new Rectangle(105)];
 
shapes.forEach(shape => {
});

public 으로 선언된 값은 클래스 외부에서 조회 할 수 있으며 private으로 선언된 값은 클래스 내부에서만 조회 할 수 있다.

따라서 위 코드에서는 circle 의 radius 값은 클래스 외부에서 조회 할 수 있지만, 33행의 rectangle 의 width 또는 height 값은 클래스 외부에서 조회 할 수 없다.


일반 객체를 interface 로 사용할 때

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
interface Person {
  name: string;
  age?: number;
  // 물음표는, 설정을 해도 되고 안해도 되는 값을 표시한다.
}
interface Developer {
  name: string;
  age?: number;
  skills: string[];
}
 
const person: Person = {
  name"김사람",
  age: 20
};
 
const expert: Developer = {
  name"김개발",
  skills: ["javascript""react"]
};

Person 과 Developer 가 형태가 유사하다.

이럴 땐 interface 를 선언 할 때 다른 interface 를 extends 키워드를 사용해서 상속받을 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
interface Person {
  name: string;
  age?: number;
  // 물음표는, 설정을 해도 되고 안해도 되는 값을 표시한다.
}
interface Developer extends Person {
  skills: string[];
}
 
const person: Person = {
  name"김사람",
  age: 20
};
 
const expert: Developer = {
  name"김개발",
  skills: ["javascript""react"]
};
 
const people: Person[] = [person, expert];

 

Type Alias

type 은 특정 타입에 별칭을 붙이는 용도로 사용한다.

이를 사용하여 객체를 위한 타입을 설정할 수도 있고, 배열, 또는 그 어떤 타입이던 별칭을 지어줄 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
type Person = {
  name: string;
  age?: number;
  // 물음표는, 설정을 해도 되고 안해도 되는 값을 표시한다.
};
 
// & 는 Intersection 으로서 두개 이상의 타입들을 합쳐준다.
type Developer = Person & {
  skills: string[];
};
 
const person: Person = {
  name"김사람"
};
 
const expert: Developer = {
  name"김개발",
  skills: ["javascript""react"]
};
 
type People = Person[];
// Person[] 를 이제 앞으로 People 이라는 타입으로 사용 할 수 있다.
const people: People = [person, expert];
 
type Color = "red" | "orange" | "yellow";
const color: Color = "red";
const colors: Color[] = ["red""orange"];

 type 과 interface 

클래스와 관련된 타입의 경우엔 interface 를 사용하는게 좋고, 일반 객체의 타입의 경우엔 그냥 type을 사용해도 무방하다 사실 객체를 위한 타입을 정의할때 무엇이든 써도 상관 없는데 일관성 있게 써야한다.

 

 

[참고]

https://medium.com/@martin_hotell/interface-vs-type-alias-in-typescript-2-7-2a8f1777af4c

https://joonsungum.github.io/post/2019-02-25-typescript-interface-and-type-alias/

Comments