본문 바로가기
TypeScript

Interface

by eddypark 2023. 9. 5.

- 타입 체크를 위해 사용된다.

- 변수, 함수, 클래스에 사용할 수 있다.

- 여러 타입을 갖는 프로퍼티로 이루어진 새로운 타입으로 정의하는 것과 유사하다.

- 프로퍼티 및 메서드의 구현을 일관성 있게 유지하는 역할을 한다.

(1) 변수와 인터페이스

- 인터페이스틑 변수의 타입으로 사용할 수 있다.

- 인터섹션 타입을 이용하여 하나의 인터페이스 타입으로 만들 수 있다.

interface a {
  x: number;
  y: string;
  z: boolean;
}

interface b {
  x: number;
  w: string;
  v: boolean;
}

let c: a;

c = { x: 26, y: 'wangi', z: false }; // 변수 c는 인터페이스 a에 맞춰 선언해야한다.
let d : a & b;                       // x, y, z, w, v의 변수를 가진 인터페이스 타입이다.

- 함수 파라미터의 타입을 선언할 수 있다.

interface Todo {
  x: number;
  y: string;
  z: boolean;
}

let todos: Todo[] = [];

function addTodo(todo: Todo) {    // 파라미터 todo의 타입으로 Todo 인터페이스를 선언하였다.
  todos = [...todos, todo];
}

const newTodo: Todo = { x: 1, y: 'wangi', z: false };
addTodo(newTodo);
console.log(todos)                // [ { x: 1, y: 'wangi', z: false } ]

(2) 함수와 인터페이스

- 함수의 타입으로도 인터페이스를 사용할 수 있다.

- 파라미터 리스트와 리턴 타입을 정의한다.

interface a{
  (num: number): number;
}

const b: a = function (num: number) {
  return num * num;
}

console.log(b(10)); // 100

(3) 클래스와 인터페이스

- 클래스 선언문의 implements 뒤에 인터페이스를 선언하면 해당 클래스는 지정된 인터페이스를 반드시 구현해야 한다.

- 직접 인스턴스를 생성할 수는 없다.

interface a {
  x: number;
  y: string;
  z: boolean;
}

// Todo 클래스는 ITodo 인터페이스를 구현하여야 한다.
class b implements a {
  constructor (
    public x: number,
    public y: string,
    public z: boolean
  ) { }
}

const c = new b(1, 'wangi', false);

console.log(c);

- 메서드도 포함할 수 있다.

interface a {
  x: string;
  y(): void;
}

class b implements a {
  constructor(public xx: string) {}

  y() {
    console.log(`${this.xx}`);
  }
}

function c(bb: a): void {
  bb.y();
}

const d = new b('Lee');
c(d);

(4) 덕 타이핑

- 해당 인터페이스에서 정의한 프로퍼티나 메서드를 가지고 있다면 그 인터페이스를 구현한 것으로 인정한다.

- 아래의 예제의 경우 변수 c는 인터페이스 a와 일치하지 않지만 x라는 프로퍼티를 가지고 있으므로 부합한 걸로 인정한다.

interface a {
  x: string;
}

function b(aaa: a): void {
  console.log(`${aaa.x}`);
}

const c = { x: 'wangi', y: 18 };
b(c);                            // wangi

(5) 선택적 프로퍼티

- 인터페이스의 프로퍼티는 반드시 구현되어야 하지만 선택적으로 필요할 경우가 있다. 그럴 때 프로퍼티 명 뒤에? 붙이면 생략이 가능하다

interface a {
  x: string;
  y: string;
  z?    : number;
  w?: string;
}

const b: a = {
  x: 'wangi',
  y: 'eddy'
}

console.log(b);

(6) 인터페이스 상속

- extends 키워드를 사용해 인터페이스 및 클래스를 상속받을 수 있다.

interface a {
  x: string;
  y?: number;
}

interface b extends a {
  z: number;
}

const c: Student =  {
  x: 'wangi',
  y: 26,
  z: 3
}

'TypeScript' 카테고리의 다른 글

데이터 타입  (1) 2023.09.07
Function  (0) 2023.09.07
타입 앨리어스  (0) 2023.09.04
Generic  (0) 2023.09.01
Module  (0) 2023.08.31