☘️ Interface
- 타입에 이름을 지어주는 문법 중 하나이다.
- 객체의 구조를 정의하는 데 특화되어 있다.
- 상속(확장), 선언 합치기(declaration merging) 등의 기능을 제공한다.
interface 예시// 타입 별칭
type A = {
a : string;
b : number;
}
// 인터페이스
interface A = {
a : string;
b : number;
}
type과 interface는 기본적으로 유사하게 동작하지만,interface는 객체 타입에 특화되어 있고 선언 합치기, 클래스 구현에 유리하다.interface 확장하기interface가 객체 타입이면 확장 가능하다.
name, color 등의 중복이 많아진다. ➡️ 유지보수에 불리하다.interface Dog {
name: string;
color: string;
isBark: boolean;
}
interface Cat {
name: string;
color: string;
isScratch: boolean;
}
interface Chicken {
name: string;
color: string;
isFly: boolean;
}
extends로 상속(확장)하기interface Animal {
name: string;
color: string;
}
interface Dog extends Animal {
isBark: boolean;
}
const dog: Dog = {
name: "hello",
color: "brown",
isBark: true,
};
interface Cat extends Animal {
isScratch: boolean;
}
interface Chicken extends Animal {
isFly: boolean;
}
name: "hello"는 string의 리터럴 서브 타입interface를 동시에 확장할 수 있다.interface DogCat extends Dog, Cat {}
const dogCat: DogCat = {
name: "Mix",
color: "gray",
isBark: true,
isScratch: true,
};
interface 선언 합치기 (Declaration Merging)type Person = {
name: string;
};
type Person = {
// 오류 발생: Duplicate identifier 'Person'
age: number;
};
interface Person {
name: string;
}
interface Person {
age: number;
}
const person: Person = {
name: "홍길동",
age: 30,
};
interface Person {
name: string;
}
interface Person {
name: number; // ❌ 오류 발생 (충돌)
age: number;
}
interface Person {
name: string;
}
interface Developer extends Person {
name: "hello"; // 가능 (string의 서브타입)
}
interface Lib {
a: number;
b: number;
}
// 선언 합치기
interface Lib {
c: string;
}
const lib: Lib = {
a: 1,
b: 2,
c: "hello", // 정상 동작
};