본문 바로가기
front/ts

[타입스크립트] 인터페이스와 타입

by juniKang 2022. 7. 21.

인터페이스와 타입의 특성에 대해 알아보자.

 

1. primitive type rename

인터페이스는 primitive type으로 선언은 불가능하지만, 타입은 가능하다. 인터페이스는 오직 object type을 선언할 때만 사용할 수 있다.


// ❌ 불가능 
interface InterfaceString = string; 
interface InterfaceString extends string; 
 
// ✔ 가능 
type TypeString = string;

 

2. 확장

인터페이스는 동일한 이름을 사용해서 확장이 가능하다. 


// ✔ 가능 
interface Fruit { 
  apple: string 
} 
 
interface Fruit { 
  banana: string 
} 
 
const fruits: Fruit = { 
  apple: '사과', 
  banana: '바나나', 
}

 

 

동일한 이름으로 확장 할 때, 프로퍼티의 타입을 늘려줄 수는 없다.


// ❌ 불가능 
interface Fruit { 
  apple: string 
} 
 
interface Fruit { 
  apple: string | number 
} 
 
 // Error : Subsequent property declarations must have the same type.   
 // Property 'apple' must be of type 'string', but here has type 'string | number'.ts(2717)

 

 

타입은 인터페이스 처럼 동일한 이름을 사용해서 확장할 수 없다.


// ❌ 불가능 
type Fruit = { 
  apple: string 
} 
type Fruit = { 
  banana: string 
} 
  // Error: Duplicate identifier 'Fruit'.

 

대신, & (intersections : 교차) 를 사용해서 확장할 수 있다.


// ✔ 가능 
type Apple = { 
  apple: string 
} 
type Banana = { 
  banana: string 
} 
type Fruit = Apple & Banan & { 
  orange: string 
} 
 
const fruit: Fruit = { 
  apple: '사과', 
  banana: '바나나', 
  orange: '오렌지', 
}

 

3. 확장 - 상속

인터페이스는 extends를 사용해서 상속받을 수 있다.


// ✔ 가능 
interface Apple { 
  apple: string 
} 
interface Banana { 
  banana: string 
} 
interface Fruit extends Apple, Banana { 
  orange: string 
} 
 
const fruit: Fruit = { 
  apple: '사과', 
  banana: '바나나', 
  orange: '오렌지', 
}

특이한 점은, type으로 부터도 상속받을 수 있다.


// ✔ 가능 
type Apple { 
  apple: string 
} 
type Banana = { 
  banana: string 
} 
interface Fruit extends Apple, Banana { 
  orange: string 
} 
 
const fruit: Fruit = { 
  apple: '사과', 
  banana: '바나나', 
  orange: '오렌지', 
}

타입은 인터페이스나 다른 타입을 상속받을 수 없다. 그러나 인터페이스를 intersection(&)으로 사용할 수는 있다.


// ❌ 불가능 
interface Apple { 
  apple: string; 
} 
type sonApple extends Apple {...} 
 
interface Banana { 
  banana: string; 
} 
type sonBanana implements Banana {...} 
 
// ✔ 가능 
interface Apple { 
  apple: string 
} 
type Fruit = Apple & { 
  banana: string 
}

 

인터페이스를 타입으로 변환할 수 있고, 타입을 인터페이스에서 상속받을 수 있다.


// ✔ 가능 
interface Apple { 
  apple: string; 
} 
 
type TypeApple = Apple; 
 
interface Fruit extends TypeApple { 
  banana: string; 
}

 

댓글