타입스크립트에서 타입을 지정하는 방식에는 2가지가 있다
type과 interface를 비교해보자
interface
- 확장(extends), (다중)상속이 가능하다
- 동일한 이름을 여러번 사용 가능(= 하나로 병합)
props를 정의할 때 사용한다
interface A {
a: string;
}
interface B {
b: string;
}
interface C extends A, B {
c: string;
}
const example: C = {
a: "a",
b: "b",
c: "c"
};
interface Car {
drive(): void; // 메소드
wheels: number;
}
interface Boat {
sail(): void;
sails: number;
}
type
- 유니언 타입( | ), 인터섹션(&) 타입 지원
- 함수, 튜플, 제네릭 등을 정의 가능
- 기본적인 타입에서 복잡한 구조까지 정의 가능
주요 차이점
1. 확장성
- interface : extends
- type : 확장 불가, 인터섹션으로 다른 타입으로 결합
2. 유니언 타입( | )과 인터섹션(&)
& (intersection) : 여러 타입이 결합된 새로운 타입 생성
interface Colorful {
color: string;
}
interface Circle {
radius: number;
}
type ColorfulCircle = Colorful & Circle;
3. 선언 병합
interface는 동일한 이름으로 선언 시 병합되지만, type은 선언이 안됨
index signature
객체의 속성 키와 값 타입을 정의하는 방법 (객체 속성이 동적으로 정의될 때)
인덱스 시그니처는 2가지의 조건을 만족해야한다
1. 인덱스 시그니처는 객체의 모든 속성이 동일한 타입이여야 한다
interface StringDictionary {
[key: string]: string; // index signature
}
const myDictionary: StringDictionary = {
firstName: "John",
lastName: "Doe"
};
interface InvalidDictionary {
[key: string]: string;
length: number; // 오류: 인덱스 시그니처와 충돌 (string 타입이 아니므로)
}
2. 특정 속성을 사용할 때는, 인덱스 시그니처 타입과 호환되어야 한다
interface CustomDictionary {
[key: string]: string | number;
length: number; // 특정 속성
name: string; // 특정 속성
}