Structural Type System vs Nominal Type System

eeensu·2023년 7월 30일

함수의 인자에 object(객체)가 들어오는 경우, 이 역시 타입을 지정해 줘야 한다.
객체의 타입을 만들어주는 방법은 interface, tpyeAlias(타입 별칭), class 등이 있다. 하지만 타입을 만들어줄 때 주의사항이 있다.

js와는 달리 객체 형태인 이자에 타입을 지정해 주지 않으면, 객체의 field를 사용할 수 없다.



올바른 사용법이다. 이러한 객체의 형태를 object literal type이라 한다.



ts에서는 객체의 타입을 지정해 주는 상황이 아주 많이 있다. 객체의 타입을 만들어주는 방법은 interface, tpyeAlias(타입 별칭), class로 가능하다. 객체의 타입을 만드는 방법은 이후 페이지에서 상세하게 다루고 있다. 이렇게 객체의 타입을 지정해 줄 때, ts는 Structural Type System을 사용한다.




Structural Type System

구조가 같으면 같은 타입으로 인식하는 시스템이다. 예를 들어

``

interface IPerson {
    name: string;
    age: number;
}

type PersonType = {
    name: string;
    age: number;
    speak(): string;
}

``

와 같은 2개의 타입이 있다고 한다면, 이름은 다르지만 구조가 동일하기에 같은 타입으로 인식하는 시스템이다. ts는 해당 방식을 따른다.


Nominal Type System

구조가 동일하다 하더라도 이름이 다르면 다른 타입으로 인식하는 시스템이다. 이러한 타입 시스템을 가진 언어는 C나 Java가 있다.

ts 환경에서 개발을 할 때, ts가 Structural Type System을 따르다 하더라도 어떠한 상황에서는 Nominal Type System으로 인식해 주길 바라는 상황이 발생할 수 있다. 강제적인 구문을 사용해서 이 방식을 사용할 수 있기는 한데, 이러한 방법은 극단적이기도 하고, 이러한 상황이 잘 나타나지 않기도 해서 잘 사용하진 않는다.




별개로, 위의 두 가지의 방법과 다르게 duck typing이라는 방식도 있다.

duck typing - 만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라고 부를 것이다.

이러한 방식을 사용하는 언어는 대표적으로 Python이 있다. 이는 ts와 무관한 방식이지만 구조적으로 같음이라는 취급되는 형식이기에 살짝 유사한 부분이 있다.

profile
안녕하세요! 프론트엔드 개발자입니다! (2024/03 ~)

0개의 댓글