1. 확장(상속)하는 법
interface
extends 키워드를 이용해서 확장할 수 있다.
interface Person {
name: string;
age: number;
}
interface Student extends Person { // 확장(상속)
school: string;
}
const mark: Student = {
name: 'mark',
age: 31,
school: 'harvard'
}
type
& 기호를 이용해서 확장할 수 있다.
type Person = {
name: string,
age: number
}
type Student = Person & { // 확장(상속)
school: string
}
const mark: Student = {
name: 'mark',
age: 31,
school: 'harvard'
}
2. 선언적 확장
interface
선언적 확장(Declaration Merging)이 가능하다.
(같은 이름의 interface를 선언하면, 자동으로 확장된다.)
interface Person {
name: string;
age: number;
}
interface Person { // 선언적 확장
gender: string;
}
const mark: Person = {
name: 'mark',
age: 31,
gender: 'male'
}
type
선언적 확장이 불가능하다.
type Person = {
name: string;
age: number;
}
type Person = { // ❗️Error: Duplicate identifier 'Person'.
gender: string;
}
➡️ 따라서 타입 객체의 확장성을 위해서는 interface를 사용하는 것이 더 좋다.
3. 자료형(type)
interface
객체(Object)의 타입을 설정할 때 사용할 수 있으며, 원시 자료형에는 사용할 수 없다.
interface Person {
name: string;
age: number;
gender: string;
}
interface name extends string { // ❌ 불가능
...
}
type
객체 타입을 정의할 때도 사용할 수 있지만, 객체 타입을 정의할 때는 interface를 사용하는게 좋고,
단순한 원시값(Primitive Type)이나 튜플(Tuple), 유니언(Union) 타입을 선언할 때 type을 사용하는 것이 좋다.
type Name = string; // primitive
type Age = number;
type Person = [string, number, boolean]; // tuple
type NumberString = string | number; // union
type Person = { // 객체는 interface를 사용하도록 하자.
name: string,
age: number,
gender: string
}
4. computed value 사용
interface
computed value 사용이 불가능하다.
type Subjects = 'math' | 'science' | 'sociology';
interface Grades {
[key in Subjects]: string; // ❗️Error: A mapped type may not declare properties or methods.
}
type
computed value 사용이 가능하다.
type Subjects = 'Math' | 'Science' | 'Sociology';
type Grades = {
[key in Subjects]: string;
}
정리
type은 모든 타입을 선언할 때 사용할 수 있고, interface는 객체에 대한 타입을 선언할 때만 사용할 수 있다.
또한 확장 불가능한 타입을 선언하고 싶다면 type을 사용하면 되고, 확장 가능한 타입을 선언하고 싶다면 interface를 사용하면 된다.
interface vs type alias
'Javascript' 카테고리의 다른 글
[JS] 모니터/브라우저 기준 팝업창 가운데 띄우기 (window.open) (1) | 2023.12.29 |
---|---|
1K 1천 1.1천 같이 숫자를 포맷하기 (0) | 2023.12.26 |
JavaScript 접속기기 모바일/웹 여부 확인 (0) | 2023.11.27 |
글 작성 경과 시간 표시 / elapsedTime (방금 전, 몇 분 전 작성) / Javascript (0) | 2023.11.07 |
[node.js] JavaScript heap out of memory (0) | 2023.08.29 |