타입스크립트 Type Aliases & Interfaces 알아보기
타입스크립트에서 타입을 선언하는데 크게 두 가지 방법이 있다.
Type Aliases와 Interfaces에 대해서 정리하고, 각각 어느 상황에서 사용하는 것이 best case일지도 생각해보았다.
Type
type 키워드는 타입을 정의하기 위해서 모든 유형에 사용될 수 있다.
동일한 유형이 두 번이상 반복된다면, type을 선언하여 사용할 수 있다.
type 키워드는 다음과 같은 특징을 지닌다.
- 객체를 포함한 모든 유형에 대한 타입을 표현할 수 있다.
- 문자열이나 숫자 등 값을 type에 할당할 수도 있다.
type Name = string | undefined;
let myName: Name;
myName = "John";
type User = {
nickname: string;
level: number;
}
const john: User = {
nickname: "king_john",
level: 15,
}
///////////////////////
type Introduce = "Hello World";
const start: Introduce = "Hello World";
type Pie = 3.14 | "3.14";
const pieNumber: Pie = 3.14;
type Protein = "meat" | "bean" | "beaf";
- type은 aliases, 별칭일 뿐으로 unique하지 않다.
type Nickname = string;
type Name = string;
let firstName: Nickname = "lee";
let lastName: Name = "hoho";
lastName = firstName;
- type은 재정의될 수 없다.
type Nickname = string;
type Nickname = number; // ERROR
Nickname = number; // ERROR
- 타입 객체는 & 키워드로 합칠 수 있다.
type A = {
a: string;
}
type B = {
b: boolean;
}
const obj: A & B = {
a: "AA",
b: false,
}
Interfaces
interface는 객체의 타입을 정의하기 위해서 사용될 수 있다.
타입스크립트가 객체 내부에 예상되는 속성이 존재하는지 확인할 수 있게 해준다.
interface는 객체 타입의 구조와 기능에 관심을 둔다.
interface 키워드는 다음과 같은 특징을 지닌다.
- 객체에만 사용될 수 있다.
interface User {
name: string;
age: number;
}
interface Nickname = string; // ERROR
- 재정의하여 확장할 수 있다.
interface User {
name: string;
age: number;
}
interface User {
balance: number;
}
const user: User = {
name: 'lee',
age: 15,
balance: 12000,
}
- 혹은 extends 키워드를 통해서 기존의 인터페이스를 확장하여 새로이 만들 수 있다.
interface User {
name: string;
age: number;
}
interface UserWithBalance extends User {
balance: number;
}
const user: UserWithBalance = {
name: 'lee',
age: 15,
balance: 12000,
}
keyof
// type
type User = {
name: string;
nickname: string;
password: number;
}
type UserKeys = keyof User;
const keys1: UserKeys = "name";
const keys2: UserKeys = "nickname";
const keys3: UserKeys = "password";
// interface
interface Computer {
cpu: string;
memory: string;
price: number;
}
type ComputerKeys = keyof Computer;
const keys11: ComputerKeys = "cpu";
const keys22: ComputerKeys = "memory";
const keys33: ComputerKeys = "price";
type과 interface 모두에서 사용할 수 있는 키워드로, 객체에서 key들의 값을 타입으로 갖는 type을 생성할 수 있다.
🍌 type과 interface는 유사하며, 대부분의 경우 자유롭게 선택할 수 있지만 차이점은 분명히 존재한다.
interface의 거의 모든 기능은 type에서 사용될 수 있다.
interface는 새로운 속성의 확장에 열려있지만, type은 상대적으로 그렇지 않다. (다만, & 키워드로 확장이 가능하다)
다른 언어와 같이 interface는 class의 명세를 나타내기에 적합하다.
🥖 타입스크립트 공식 문서에서는 초보자에게 interface의 사용을 권장하고있다.
🍅 하지만, type aliases는 프로퍼티에 접근할 수 있고, union같은 기능을 사용할 수 있으므로 변수를 표현하기에 더 적합한 것은 type이다.
타입스크립트 공식 문서 핸드북
https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#type-aliases
Documentation - Everyday Types
The language primitives.
www.typescriptlang.org
참고 자료
https://stackoverflow.com/questions/72598769/intersection-types-vs-interfaces-in-typescript
Intersection types vs interfaces in typescript
Here's the scenario: type Admin = { name : string, privileges : string[] } type Employee ={ name : string, startDate : Date } type ElevatedEmployee = Admin & Employee; const e...
stackoverflow.com
https://github.com/microsoft/TypeScript/wiki/Performance#preferring-interfaces-over-intersections
Performance
TypeScript is a superset of JavaScript that compiles to clean JavaScript output. - microsoft/TypeScript
github.com