extends
키워드를 활용해 확장 가능
interface Person {
name: string;
age: number;
}
interface Student extends Person { // 확장(상속)
school: string;
}
const SeoYeong: Student = {
name: 'SeoYeong',
age: 28,
school: 'HNU'
}
&
기호를 활용해 확장 가능
type Person = {
name: string,
age: number
}
type Student = Person & { // 확장(상속)
school: string
}
const SeoYeong: Student = {
name: 'SeoYeong',
age: 28,
school: 'HNU'
}
선언적 확장 가능
같은 이름의 interface를 선언하면, 자동으로 확장된다.
interface Person {
name: string;
age: number;
}
interface Person { // 선언적 확장
gender: string;
}
const SeoYeong: Student = {
name: 'SeoYeong',
age: 28,
gender: 'female'
}
선언적 확장 불가능
type Person = {
name: string;
age: number;
}
type Person = { // ❗️Error: Duplicate identifier 'Person'.
gender: string;
}
interface
를 활용하는 것이 좋다.객체의 타입을 설정할 때 사용 가능하고, 원시 자료형에는 사용 불가능하다.
interface Person {
name: string;
age: number;
gender: string;
}
interface name extends string { // ❌ 불가능
...
}
객체의 타입을 정의할 때도 사용이 가능하지만, 객체의 타입을 정의할 때는 interface
를 활용하는게 더 좋다.
단순한 원시값이나 튜플, 유니온 등의 타입을 선언할 때 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
}
computed value 사용이 불가능하다.
type Subjects = 'math' | 'science' | 'sociology';
interface Grades {
[key in Subjects]: string; // ❗️Error: A mapped type may not declare properties or methods.
}
computed value 사용이 가능하다.
type Subjects = 'Math' | 'Science' | 'Sociology';
type Grades = {
[key in Subjects]: string;
}