[TypeScript] 타입스크립트 오브젝트 타입의 특징

2023-03-22


사진: Unsplash 의 Irina Iriser


1. 정의

 

공식문서에 따르면 TypeScript에서 Object는 하나로 정의 되는 타입이 아니라고 한다.  아래의 코드를 살펴보자.

 

interface Pointlike {
  x: number;
  y: number;
}
interface Named {
  name: string;
}
 
function logPoint(point: Pointlike) {
  console.log("x = " + point.x + ", y = " + point.y);
}
 
function logName(x: Named) {
  console.log("Hello, " + x.name);
}
 
const obj = {
  x: 0,
  y: 0,
  name: "Origin",
};
 
logPoint(obj);
logName(obj);

 

PointlikeNamed라는 각각의 인터페이스가 존재하고 이를 출력하는 간단함 함수가 만들어져 있다. 그 이후에 이 두 가지 인터페이스의 필드값을 가지는 Object 객체를 생성해 준 후 함수를 출력하면 어떻게 될까? 일반적인 생각으로 오류가 발생할 거라고 생각할 수 있지만 실제 결과를 보면 놀랍게도 오류 없이 해당 함수가 실행되는 것을 알 수 있다.

 


위와 같은 결과가 나오는 이유는 앞서 말했듯이 "In TypeScript, objects are not of a single exact type." 와 같이 오브젝트는 하나의 타입이 아니기 때문이다. 타입간의 관계는 그 타입들 간의 선언에 종속되지 않고 그 타입이 구성하고 있는 필드 값에 따라 정의되기 때문이다. 다시 말해 타입은 하나의 집합이라고 생각하며 되며, 위의 예제에서의 obj 객체는 Pointlike의 필드값과 Named의 필드값을 가지는 집합이라고 볼 수 있다.

 

추가적으로 typeScript에서의 type은 구체화되지 않기 때문에 obj 가 Pointlike와 같은 객체의 필드값을 가지고 있는지에는 알려주지 않는 점도 참고해야 합니다.


메인 이미지 출처 : 사진: UnsplashIrina Iriser