혼자 적어보는 노트

[TypeScript] 인터페이스(interface) / Type과의 차이점 본문

Typescript

[TypeScript] 인터페이스(interface) / Type과의 차이점

jinist 2022. 5. 22. 06:49

 

인터페이스(Interface)

상호간의 정의한 약속 또는 규칙을 의미한다.

미리 내부를 정의해 두는 것

 

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

function printUser(user: User) {
  console.log(user.name, user.age);
}

const user = { name: 'jay', age: 22 };
printUser(user);

 

옵션 속성 (Optional)

일부 속성을 사용하지 않을 경우 ?을 사용하여 옵션 속성을 지정할 수 있다.

 

  interface User {
    name: string;
    age?: number;
  }
  
  function printUser(user: User) {
    console.log(user.name);
  }
  
  const user = { name: 'jay'};
  printUser(user);

 

익명 인터페이스

인터페이스를 미리 선언해놓지 않고 익명으로 작성할 수도 있다.

const person: {
  name: string,
  age?: number
} = {
  name: 'Jay',
  age: 100
}

 

대수 관계

여러 자료형의 값을 가질 수 있게 할 수 있다.

원시타입의 값에서는 &을 사용할 순 없지만 객체에서는 &을 사용할 수 있다.

interface Name {
  name: string;
}

interface Age {
  age: number;
}

let Jay: Name & Age = {
  name: 'Jay',
  age: 100
}

 

읽기 전용 속성

처음 인터페이스를 생성할때 값을 할당하고 이후에는 변경할 수 없는 속성

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

  
  const user:User = { name: 'jay', age: 20};
  user.name = "hey"; // error

 

 

Partial, Required, Pick, Omit

기존의 interface를 재활용하여 사용할 수 있다.

interface User {
  id: number;
  name: string;
  age: number;
  createdAt?: string;
  updatedAt?: string;
}

// 모든 필드가 Optional이 된다.
const partial: Partial<User> = {}

// 모든 필드가 Required가 된다.
const required: Required<User> {
  id: 1,
  name: "Jay",
  age: 100,
  createdAt: '',
  updatedAt: ''
}

// 특정 필드만 골라서 사용할 수 있다.
const pick: Pick<User, 'name' | 'age'> = {
  name: "Jay",
  age: 100
}

// 특정 필드만 빼고 사용할 수 있다.
const omit: Omit<User, 'id' | 'createdAt' | 'updatedAt'> = {
  name: "Jay",
  age: 100,
}

 

확장

인터페이스를 상속받아서 사용할 수 있다.

  interface User {
    id: string;
    pw: string;
  }

  interface loginUser extends User{
    isLogin: boolean;
  }

 

클래스에서의 인터페이스

implements 키워드를 사용하여 class에 인터페이스를 지정할 수 있다.

  interface User {
    name: string;
    greeting(message: string):void;
  }

  class MyUser implements User {
    name: string = 'Jay';
    greeting(message :string): void {
      console.log(message)
    }
  }

  const myUser = new MyUser();
  myUser.greeting('Hello');

 

 

인터페이스(Interface)와 타입(Type)의 차이점?

인터페이스를 살펴보니 type과 같은 기능을 하는 것 같은데

타입과 다른 점은 무엇일까?

 

선언적인 확장 가능

인터페이스는 같은 이름으로 선언시 컴파일 시점에서 확장시켜준다.

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

  const user:User = { name:"Jay", age: 20 };

 

 

객체에만 사용 가능

인터페이스는 객체에서만 사용이 가능하다.

  type Name = string; // OK
  interface Nickname = string; // error

 

computed Value 사용 불가

인터페이스는 type에서 사용할 수 있는 computed Value를 사용할 수 없다.

interface NameInterface {
  [key in names]: string; // error
}

 

 

이 외에 타입 합성의 경우 모든 구성요소에 대한 타입을 체크하기 때문에

무조건 객체 타입을 생성하는 interface에 비해 성능적인 부분에서 좋지 않다고 한다.

 

 

 

 

 

참고:

https://yceffort.kr/2021/03/typescript-interface-vs-type

https://joshua1988.github.io/ts/guide/interfaces.html#%ED%81%B4%EB%9E%98%EC%8A%A4-%ED%83%80%EC%9E%85

 

Comments