Community

Toss에서 TypeScript를 쓰면서 TypeScript가 사용하는 구조적 서브 타이핑을 자세히 살펴보면서 평소 궁금하던 부분을 이해해가는 과정을 적었는데 재미있게 읽었습니다. 구조적 서브 타

Toss에서 TypeScript를 쓰면서 TypeScript가 사용하는 구조적 서브 타이핑을 자세히 살펴보면서 평소 궁금하던 부분을 이해해가는 과정을 적었는데 재미있게 읽었습니다. 구조적 서브 타이핑이라고 하면 보통 duck typing(만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라고 부를 것이다.)이라고도 부르는 타이핑으로 명목적 서브 타이핑과는 달리 객체의 프로퍼티가 같으면 타입을 허용하는 방식입니다. TypeScript는 구조적 서브 타이핑을 사용하고 있기 때문에 같은 타입이 아니더라도 프로퍼티가 같으면 타입 호환이 되는데 오브젝트 리터럴을 직접 전달하면 타입 호환이 되지 않습니다. 평소 이부분을 궁금해하다가 정확한 원인을 찾아본 결과 TypeScript가 객체의 Freshness를 추척한다는 것을 알게 되었습니다. 타입 단언을 하거나 타입 추론으로 확장될 때 Freshness가 사라지게 되는데 오브젝트 리터럴은 Freshness가 사라지지 않았으므로 타입 호환이 되지 않은 것입니다. 이는 디자인 결정인데 오브젝트 리터럴을 허용하는 경우 불필요한 프로퍼티도 사용된다고 오해할 수 있고 타입의 오타가 있는 경우도 허용되는 문제가 있어서 TypeScript는 이를 지원하지 않습니다. 특수한 이유로 이를 허용하고자 한다면 타입에 Index signature를 포함해서 허용시킬 수 있고 Branded type을 적용해서 지정한 타입 외에는 허용되지 않도록 막을 수도 있다고 합니다. TypeScript를 쓰면서 타입을 맞추느라 고생을 하고 있어서 이부분이 궁금했는데 좀더 이해를 하게 되었습니다.

알림

알림이 없습니다