문서의 이전 판입니다!
TypeScript의 타입호환성은 구조적인 하위타입(structural subtyping)을 기반으로 합니다. structual typing은 멤버에게만 의존하여 Type을 연관시키는 방법입니다. 이는 일반적인 타입핑과는 대조적입니다.
TypeScript의 타입정보는 단지 컴파일 타임에만 존재한다.
interface Named { name: string; } class Person { name: string; } let p: Named; p = new Person(); // OK, beacuse of structual typing
Person클래스가 Named인터페이스의 구현체라고 명시적으로 기술하지 않았기 때문에 C#, Java와 같은 명목적 선언 언어에서는 위와 같은 코드는 오류가 발생한다.
TypeScript의 structural type system은 일반적으로 Javascript코드가 작성된 방식에 따라 설계되었습니다. JavaScript는 함수표현식 및 객체 리터럴과 같은 익명 객체를 광범위하게 사용하기 때문에 일반 타입 시스템 대신에 structual type system을 사용하여 JavaScript라이브러리에서 발견되는 관계의 종류를 표현하는 것이 훨씬 자연 스럽습니다.
TypeScript의 타입 시스템을 사용하면 컴파일 타임에 알 수없는 특정 작업을 수행할 수 있습니다. 하지만 타입 시스템에 이 프로퍼티가 있으면 건전하지 않습니다. TypeScript는 건전하지 않는 동작을 허용하는 장소를 신중하게 고려했으며, 이 문서 전체에서 이러한 상황이 발생하는 곳과 그 뒤에있는 동기 부여 시나리오에 대해 설명합니다.
TypeScript Structural 타입 시스템의 기본 규칙은 y가 적어도 x와 같은 멤버를 가지고 있다면 x는 y와 호환된다는 것입니다.
interface Named { name: string } let x: Named; // y's inferred type is { name: string; location: string; } let y = { name: "Alice", location: "Seattle" }; x = y;
y가 x에 할당 될 수 있는지를 검사하기 위해, 컴파일러는 x의 각 프로퍼티을 검사하여 y에서 호환되는 대응 프로퍼티를 찾습니다. 이 경우y는 문자열인 name 멤버를 가져야합니다. 그렇기 때문에 위 코드는 할당이 허용됩니다.
함수 호출 파라미터를 검사할 때도 동일한 할당 규칙이 사용됩니다.
function greet(n: Named) { alert("Hello, " + n.name); } greet(y); // OK
y는 여분의 location 속성을 가지고 있지만 위 코드는 오류를 발생하지 않습니다. 호환성을 검사할 때 대상 타입(이 경우 Named)의 멤버만 고려됩니다.
이러한 비교 프로세스는 재귀적으로 진행되어 각 구성원 및 하위 구성원의 타입을 탐색합니다.