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

인터페이스

객체가 갖추어야 할 것을 적어 두고 여러 곳에서 지킵니다.

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

객체가 갖추어야 할 것을 적어 둡니다

2.4 에서 type 으로 객체 형태에 이름을 붙였습니다. 같은 일을 하는 문법이 하나 더 있습니다.

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

등호도 세미콜론도 없습니다. 함수를 선언하는 것과 비슷하게 생겼습니다. 둘의 차이는 다음 단원에서 보고, 여기서는 인터페이스를 다루는 법을 봅니다.

최소 예제 · 편집 가능

인터페이스로 매개 변수 적기

main.ts
interface User {
	name: string;
	age: number;
}

function show(user: User): void {
	console.log(`${user.name} (${user.age})`);
}

show({ name: "홍길동", age: 27 });
출력
홍길동 (27)

type User = { … } 로 적은 것과 쓰는 자리에서는 차이가 없습니다. 매개 변수·반환·변수 어디에나 같은 방식으로 적습니다.

상세 사용법

선택 속성과 읽기 전용

2.3 에서 본 ?readonly 를 그대로 사용합니다.

main.ts
interface User {
	readonly id: number;
	name: string;
	nickname?: string;
}

const a: User = { id: 1, name: "홍길동", nickname: "길동" };
const b: User = { id: 2, name: "김철수" };

console.log(a.nickname ?? "별명 없음");
console.log(b.nickname ?? "별명 없음");

b.id = 3;
출력
13:3 TS2540 읽기 전용 속성이므로 'id'에 할당할 수 없습니다.

마지막 줄만 지우면 길동별명 없음 이 나옵니다. 고쳐서 실행해 보세요.

상세 사용법

물려받아 넓히기

extends 로 이미 있는 인터페이스를 물려받습니다. 2.4 의 & 와 하는 일이 비슷하지만, 이쪽이 인터페이스의 방식입니다.

main.ts
interface Person {
	name: string;
}

interface Member extends Person {
	level: "basic" | "pro";
}

const m: Member = { name: "홍길동", level: "pro" };

console.log(`${m.name} ${m.level}`);
출력
홍길동 pro

Membernamelevel 을 모두 갖추어야 합니다. 여럿을 한 번에 물려받을 수도 있습니다 — interface A extends B, C { … }.

흔한 실수

처음에 자주 걸리는 것

등호를 찍는 것

interface User = { … } 는 문법 오류입니다. type 과 모양이 달라 자주 헷갈립니다.

인터페이스도 실행되지 않습니다

type 과 마찬가지로 검사할 때만 있고 JavaScript 로 바뀌면 사라집니다. new User() 같은 것은 할 수 없습니다 — 그것은 클래스입니다(3.5).

물려받을 때 좁히기만 됩니다

물려받은 속성의 타입을 넓히는 쪽으로 바꿀 수 없습니다. name: stringname: string | number 로 바꾸면 오류입니다.

실습 문제

직접 해보기

1. 책 인터페이스 난이도 하

제목·쪽수는 반드시, 지은이는 없어도 되는 인터페이스를 만들고 출력하는 함수를 작성하세요.

interface Book {
	title: string;
	pages: number;
	author?: string;
}

function show(book: Book): void {
	console.log(`${book.title} (${book.pages}쪽) ${book.author ?? "지은이 미상"}`);
}

show({ title: "타입스크립트 입문", pages: 320, author: "홍길동" });
show({ title: "이름 없는 책", pages: 100 });
2. 물려받아 넓히기 난이도 중

Book 을 물려받아 전자책 인터페이스를 만드세요. 파일 크기를 더합니다.

interface Book {
	title: string;
	pages: number;
}

interface EBook extends Book {
	sizeMb: number;
}

const e: EBook = { title: "타입스크립트 입문", pages: 320, sizeMb: 12 };

console.log(`${e.title} ${e.sizeMb}MB`);
요약

이 단원의 정리

  • interface 이름 { … } 로 객체 형태에 이름을 붙입니다.
  • 등호도 세미콜론도 없습니다.
  • ?readonly 를 그대로 사용합니다.
  • extends 로 물려받아 넓힙니다.
  • 검사할 때만 있고 실행되는 코드에는 남지 않습니다.