TS 3.2 · 3부. 인터페이스와 제네릭

interface 와 type

무엇이 같고 무엇이 다른지, 어느 쪽을 사용할지 봅니다.

예상 학습 시간 13분 실행 단추가 있는 예제는 고쳐서 실행해 볼 수 있습니다 난이도 입문
개념 설명

거의 같고, 두 가지가 다릅니다

객체 형태를 적는 데는 둘 다 됩니다. 아래 두 줄은 쓰는 자리에서 완전히 같습니다.

interface User { name: string; }

type User = { name: string; };

다른 것은 둘입니다.

interfacetype
객체 형태됩니다됩니다
유니온 · 함수 · 튜플안 됩니다됩니다
같은 이름을 다시 열기됩니다(합쳐집니다)안 됩니다
최소 예제 · 편집 가능

type 만 되는 것

main.ts
type Id = string | number;
type Formatter = (value: number) => string;
type Pair = [string, number];

const id: Id = 1;
const won: Formatter = v => `${v}원`;
const pair: Pair = ["홍길동", 27];

console.log(id, won(1000), pair[0]);
출력
1 1000원 홍길동

객체가 아닌 것에는 interface 를 쓸 수 없습니다. 유니온·함수·튜플에 이름을 붙이려면 type 입니다.

최소 예제 · 편집 가능

interface 만 되는 것

main.ts
interface User {
	name: string;
}

interface User {
	age: number;
}

const u: User = { name: "홍길동", age: 27 };

console.log(`${u.name} ${u.age}`);
출력
홍길동 27

같은 이름으로 두 번 적었는데 오류가 아닙니다. 둘이 합쳐져 { name: string; age: number } 가 됩니다.

main.ts
type User = {
	name: string;
};

type User = {
	age: number;
};
출력
1:6 TS2300 'User' 식별자가 중복되었습니다. 5:6 TS2300 'User' 식별자가 중복되었습니다.

합쳐지는 것이 좋기만 한 것은 아닙니다. 내가 적지 않은 곳에서 속성이 늘어날 수 있다는 뜻이라, 실수로 같은 이름을 두면 알아채기 어렵습니다.

이 성질이 값을 하는 자리는 남이 만든 타입을 넓힐 때입니다. 라이브러리가 적어 둔 인터페이스에 내 프로젝트의 속성을 더할 수 있습니다(4.3).

상세 사용법

어느 쪽을 사용하나

어느 쪽이든 됩니다. 팀에서 하나로 맞추는 것이 가장 중요하고, 흔한 기준은 이렇습니다.

  • 객체의 형태를 적을 때는 interface. 특히 남이 물려받거나 넓힐 수 있는 것.
  • 그 밖의 모든 것type — 유니온, 함수, 튜플, 그리고 있는 타입을 조합해 만드는 것(3.4).

이 트랙에서도 그렇게 적었습니다. LevelFormattertype, UserMemberinterface 입니다.

흔한 실수

처음에 자주 걸리는 것

둘을 섞어 물려받는 것

interface A extends SomeType 도 되고, type B = SomeInterface & { … } 도 됩니다. 섞어도 됩니다 — 다만 읽는 사람이 헷갈리므로 한 가지로 맞춥니다.

오류 메시지의 모양이 다릅니다

interface 는 이름이 그대로 나오고, type 은 펼쳐진 형태가 나올 때가 있습니다. 읽기는 interface 쪽이 편합니다.

같은 이름을 실수로 두 번 적는 것

type 이면 곧바로 오류지만 interface 는 조용히 합쳐집니다. 큰 프로젝트에서 찾기 어려운 자리입니다.

실습 문제

직접 해보기

1. 바꿔 적어 보기 난이도 하

3.1 의 Book 인터페이스를 type 으로 바꿔 적고, 쓰는 자리는 그대로 도는지 확인하세요.

type Book = {
	title: string;
	pages: number;
	author?: string;
};

function show(book: Book): void {
	console.log(`${book.title} (${book.pages}쪽)`);
}

show({ title: "타입스크립트 입문", pages: 320 });
2. 안 되는 것 확인하기 난이도 중

interface 로 유니온에 이름을 붙여 보고, 어떤 오류가 나는지 확인하세요.

interface Id = string | number; 를 적으면 등호 자리에서 문법 오류가 납니다. interface 뒤에는 중괄호만 올 수 있기 때문입니다.
요약

이 단원의 정리

  • 객체 형태를 적는 데는 둘 다 되고, 쓰는 자리에서는 차이가 없습니다.
  • 유니온·함수·튜플에 이름을 붙이려면 type 입니다.
  • 같은 이름의 interface 는 합쳐지고, type 은 오류입니다.
  • 객체는 interface, 그 밖은 type 이 흔한 기준입니다.
  • 가장 중요한 것은 한 프로젝트 안에서 하나로 맞추는 것입니다.