타입 호환

타입 호환

타입스크립트 타입 호환

타입 호환이란?

타입 호환 이란 서로 다른 타입이 2개 있을 때 특정 타입이 다른 타입에 포홤되는지를 의미한다.

let a: string = 'a';
let b: 'a' = 'a';

a = b

b 변수를 a 변수에 할당했을 때 별도의 타입 에러가 발생하지 않았으므로 ab의 타입은 서로 호환된다고 볼 수 있다.

  • 타입 에러가 발생하지 않는 이유 - string > hi

구조적 타이핑

구조적 타이핑 이란 타입 구조로 호환 여부를 판별하는 언어적 특성을 의미한다.

interface Iron {
  name: string;
}

interface Gold {
  name: string;
}

let a: Iron = {
  name: '';
}

let b: Gold {
  name: '';
}

b = a;

타입 별칭과 인터페이스는 모두 문자열 타입의 name 속성을 갖고 있기 때문에 타입 구조가 같다고 볼 수 있다.

  • 타입 호환 여부를 판별할 때는 단순히 문자열 타입의 특정 속성 유무만 보지 않고 속성 이름까지 일치하는지 확인한다.

객체 타입의 호환

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

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

type Iron = {
  name: string;
}

interface Gold {
  name: string;
  price: number;
}

let a: Iron = {
  name: '';
}

let b: Gold = {
  nmae; '';
  price: 500;
}

a = b;

위의 코드는 타입 에러가 발생하지 않는다.

Gold 타입에 price 속성이 하나 더 선언되어 있지만 Iron 타입 입장에서 호환하는 데 필요한 조건인 문자열 타입의 name 속성이 정의되어 있기 때문에 호환되는 것으로 간주된다.

  • 반대로 변수를 할당할 경우에는 에러가 발생한다.
    • 에러를 해결하고 싶으면 속성에 옵셔널로 변경하거나 타입이 동일하게 만들어준다.

함수 타입의 호환

함수 타입도 구조적 타이핑 관점에서 함수 구조가 유사하면 호환된다.

let getNumber = function(num) {
  return num;
}

let sum = function(x, y) {
  return x + y;
}

console.log(sum(10, 20)); // 30
getNumber = getNumber;
console.log(sum(10, 20)); // 10

sum(10, 20);을 호출하더라도 함수의 동작이 깨지지 않고, 첫 번째로 받은 인자로 그대로 반환하여 10을 출력해 준다.

특정 함수 타입의 부분 집합에 해당하는 함수는 호환되지만, 더 크거나 타입을 만족하지 못하는 함수는 호환되지 않았다.


이넘 타입의 호환

이넘 타입은 값 여러 개를 하나로 묶어서 사용해야 할 때 활용되는 타입이다.

enum Language {
  C,
  Java,
  TypeScript
}

let a: number = 10;
a = Language.C:

숫자형 이넘은 숫자와 호환된다.

이넘 속성의 값을 숫자형 변수에 할당해도 다음과 같이 에러가 발생하지 않는다.

  • 이넘 타입은 같은 속성과 값을 가졌더라도 이넘 타입 간에는 서로 호환되지 않는다.

제네릭 타입의 호환

제네릭의 타입 호환은 제네릭으로 받은 타입이 해당 타입 구조에서 사용되었는지에 따라 결정된다.

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

interface NotEmpty<T> {
  data: T;
}

let a: NotEmpty<string>;
let b: NotEmpty<number>;

두 변수에 각각 stringnumber를 제네릭 타입으로 넘기게 되면 인터페이스의 타입 구조가 달라진다.

제네릭의 타입 호환 여부를 살펴볼 때는 제네릭으로 타입이 해당 타입 구조 내에서 사용되었는지 확인하면 된다.


© 2021. All rights reserved.

Powered by Hydejack v9.1.6