2023-03-22
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);
Pointlike와 Named라는 각각의 인터페이스가 존재하고 이를 출력하는 간단함 함수가 만들어져 있다. 그 이후에 이 두 가지 인터페이스의 필드값을 가지는 Object 객체를 생성해 준 후 함수를 출력하면 어떻게 될까? 일반적인 생각으로 오류가 발생할 거라고 생각할 수 있지만 실제 결과를 보면 놀랍게도 오류 없이 해당 함수가 실행되는 것을 알 수 있다.
위와 같은 결과가 나오는 이유는 앞서 말했듯이 "In TypeScript, objects are not of a single exact type." 와 같이 오브젝트는 하나의 타입이 아니기 때문이다. 타입간의 관계는 그 타입들 간의 선언에 종속되지 않고 그 타입이 구성하고 있는 필드 값에 따라 정의되기 때문이다. 다시 말해 타입은 하나의 집합이라고 생각하며 되며, 위의 예제에서의 obj 객체는 Pointlike의 필드값과 Named의 필드값을 가지는 집합이라고 볼 수 있다.
추가적으로 typeScript에서의 type은 구체화되지 않기 때문에 obj 가 Pointlike와 같은 객체의 필드값을 가지고 있는지에는 알려주지 않는 점도 참고해야 합니다.
메인 이미지 출처 : 사진: Unsplash의Irina Iriser