솔미는 성장중

[TS] 타입 호환 본문

TypeScript

[TS] 타입 호환

solming 2023. 8. 31. 05:07
728x90

💻 타입 호환

서로 다른 타입이 2개 있을 때 특정 타입이 다른 타입에 포함되는지를 의미

 

 

💻 구조적 타이핑

Animals 클래스가 Dog 인터페이스를 상속받아 구현하지 않았는데도 에러가 발생하지 않는 이유는?

interface Dog {
  name:string;
}
interface Animals {
  name:string;
}

let i: Dog;
i=new Animals();

구조적 타이핑 특성 때문이다!!

 

🌞 구조적 타이핑 이란?

타입 유형보다는 타입 구조로 호환 여부를 판별하는 언어적 특성

ex) 타입별칭과 인터페이스도 같은 타입 구조를 갖고 있다면 호환 가능
     ( 속성 이름까지 일치해야 함 )

 

 

 

💻 호환 가능 여부따지기

1. 객체 타입의 호환

- 타입 유형에 관계없이 동일한 이름의 속성을 갖고 있고 해당 속성의 타입이 같으면 호환 가능

- 두 타입 간 동일한 타입을 가진 속성이 1개라도 있다면 호환 가능

 

ex)

type Person = {
  name: string;
}
interface Developer = {
  name: string;
  skill: string;
}

let A: Person = {
  name: '에이'
}
let B: Developer = {
  name: '삐',
  skill: '개발'
}
A = B //ok
B = A //error. A는 skill속성이 없어서. (해결하려면 skill 속성 추가 or 옵셔널로 변경)

(속성 개수가 더 적은 객체에 속성 개수가 더 많은 객체를 할당 가능

= 속성 개수가 더 많은 쪽이 속성 개수가 더 적은 쪽으로 호환됨)

 

2. 함수 타입의 호환

함수의 타입 호환 기준 = 기존 함수 코드의 동작을 보장해줄 수 있는가?

파라미터가 더 많이 정의된 함수에 파라미터가 더 적은 함수를 할당 가능

 

(반대의 경우는 빈 곳에 undefined 값이 들어가버림)

 

3. 이넘 타입의 호환

- 숫자형 이넘은 숫자와 호환됨

- 이넘 타입은 같은 속성과 값을 가졌더라도 이넘 타입 간에는 서로 호환 X 

 

4. 제네릭 타입의 호환

- 제네릭으로 받은 타입이 해당 타입 구조에서 사용되었는지에 따라

 

ex) 제네릭으로 받은 타입이 해당 타입 구조에서 사용되지 않는다면 타입 호환에 영향 X

interface Empty<T>{}
let empty1: Empty<string>='';
let empty2: Empty<number>=0;

empty2 = empty1; //ok
empty1 = empty2; //ok

ex) 제네릭으로 받은 타입을 타입 구조 안에서 사용한 경우

interface NotEmpty<T>{ data: T; }
let notEmpty1: NotEmpty<string>;
let notEmpty2: NotEmpty<number>;

notEmpty2 = notEmpty1; //error
notEmpty1 = notEmpty2; //error
728x90