728x90
타입 호환이란 타입 스크립트 코드에서 특정 타입이 다른 타입에 잘 맞는지를 의미한다(타입 스크립트에서는 내부 속성을 타입을 가지고 구분하기 때문에 가능하다)
인터페이스, 클래스 타입 호환
//인터페이스
interface Developer {
name: string;
skill: string;
}
interface Person {
name: string;
}
class Person{
name: string
}
var developer: Developer;
var person: Person;
//왼쪽 타입이 더 크기 때문에 오류가 발생한다.
//developer = person //오류 -> person은 name만 developer는 name,skill 두가지 타입을 가지고 있기 때문에 대입이 불가능
person = developer //왼쪽 타입이 더 작기 때문에 더 큰값으로는 대입 가능
//developer = new Person() //오류
- 대입하려는 타입보다, 대입하는 타입이 더 클 경우에만, 타입 호환이 가능하다
- 여기서는 Person 타입에 Developer 타입을 호환하는 것은 가능하지만, 반대로 Developer 타입에 Person 타입을 호환하는 것은 불가능하다.
- 이넘 타입은 number 타입과 호환이 되지만, 이넘 타입끼리는 호환되지 않는다.
함수와 제네릭 타입 호환
//함수
var add = function (a: number) { //파라미터 한개
//..
}
var sum = function (a: number, b: number) { //파라미터 2개
//...
}
//sum의 함수 구조가 add 함수 구조보다 크다.
//add = sum; //불가능: sum은 2개인자를 받아야 하기 때문에
sum = add; //가능하다: add는 1개 인자만 받기 때문 2개 인자를 넘기는 sum에 대입가능
//제네릭
interface Empty<T> {
//...
}
var empty1: Empty<string>
var empty2: Empty<number>
empty1 = empty2
empty2 = empty1
interface NotEmpty<T> {
data: T; //오른쪽 타입이 다르기 때문에 호환되지 않는다
}
var notEmpty1: NotEmpty<string>
var notEmpty2: NotEmpty<number>
//notEmpty1 = notEmpty2
//notEmpty2 = notEmpty1
- 더 큰 범위을 함수(파라미터 개수가 많다, 내부 로직은 상관없음)에 작은 범위의 함수를 대입하는 것은 상관없지만, 반대는 불가능하다.
- 제네릭 같은 경우 내부적으로 변수의 타입이 제네릭으로 되어 있는경우에는 타입 호환이 동작하지 않는다.
728x90