목차
· interface에 대해 알아보아요
· type에 대해 알아보아요
타입을 정의하는 방법에는 크게 interface · type 정의 방법이 있어요.
내가 현재 사용하고 있는 inferface 또는 type이 어떤 특징들을 가지고 사용하고 계신지 알고 계신가요?
interface에 대해 알아보아요
interface는 객체의 형태를 확장하는데 용이한 반면에 type은 튜플, 인터섹션, 유니온 등을 이용하여 더 복잡한 타입 정의 및 조합을 표현하는데 용이해요. interface는 선언 병합을 지원하여 여러 번 선언을 할 수 있는데, 주로 객체 타입을 확장할 때 유리해요. 동일한 이름을 가진 interface를 여러 번 선언하면, 이 속성들이 자동으로 합쳐져요.
interface Person {
age: number;
name: string;
};
interface Person {
company: string;
};
const hyeonwoo: Person = {
age: 28,
name: '김현우',
company: '현우랜드'
};
위 코드에서 Person interface를 여러 번 선언할 수 있으며, 결과적으로 하나의 interface로 병합이 되어요.
다른 방법으로는 extends을 활용하여 확장도 가능해요. extends에는 객체 타입을 설정할 때만 가능하고, string · number와 같은 원시 자료형을 extends 할 수는 없어요.
inteface Person {
name: string;
age: number;
}
interface Student extends Person {
school: string;
}
const hyeonwoo: Student = {
name: '김현우',
age: 28,
school: 'korea school'
}
type에 대해 알아보아요
type으로 선언한 경우에는 동일한 이름을 중복 선언하게 되면 에러가 발생해요. 대신 type은 튜플과 같은 복잡한 타입 표현이 가능하고, 복잡한 타입 조합을 위해서 인터섹션(&)과 유니온(|) 연산자를 지원해요. type에서는 interface와 마찬가지로 선언적 확장이 불가하니 주의를 해야해요.
type BasicInfo = {
name: string;
age: number;
};
type ContactInfo = {
email: string;
phone: string;
};
/** 인터섹션(&)을 사용하여 두 타입을 결합하여 하나의 타입으로 생성 */
type PersonInfo = BasicInfo & ContactInfo;
const hyeonwoo: PersonInfo = {
name: '김현우',
age: 28,
email: 'gentlemonster77@likelion.org',
phone: '010-1234-5678'
};
type으로도 객체 타입을 정의할 수는 있지만, 객체 타입을 정의할 때는 interface로 하는 것이 좋고, 단순한 원시 값 또는 튜플 및 유니언 타입을 선언할 때는 type을 사용하는 것이 편할 수 있어요.
/** primitive */
type Name = string;
type Age = number;
/** tuple */
type Person = [string, number, boolean]
/** union */
type NumberString = string | number;
정리를 해보면, interface는 선언 병합을 통해서 여러 번 선언이 가능하고 주로 객체 타입을 확장하는데 유리해요, 반대로 type의 경우에는 튜플 등 복잡한 타입을 사용하고 유연한 연산자를 통해 복잡한 타입 조합을 표현하는데 적합해요.
댓글