사용자 도구

사이트 도구


typescript:type_compatibility

문서의 이전 판입니다!


Type Compatibility

Introduction

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라이브러리에서 발견되는 관계의 종류를 표현하는 것이 훨씬 자연 스럽습니다.

Note on Soundness

TypeScript의 타입 시스템을 사용하면 컴파일 타임에 알 수없는 특정 작업을 수행할 수 있습니다. 하지만 타입 시스템에 이 프로퍼티가 있으면 건전하지 않습니다. TypeScript는 건전하지 않는 동작을 허용하는 장소를 신중하게 고려했으며, 이 문서 전체에서 이러한 상황이 발생하는 곳과 그 뒤에있는 동기 부여 시나리오에 대해 설명합니다.

Starting out

TypeScript Structural 타입 시스템의 기본 규칙은 y가 적어도 x와 같은 멤버를 가지고 있다면 xy와 호환된다는 것입니다.

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)의 멤버만 고려됩니다.

이러한 비교 프로세스는 재귀적으로 진행되어 각 구성원 및 하위 구성원의 타입을 탐색합니다.

typescript/type_compatibility.1564386560.txt.gz · 마지막으로 수정됨: 2025/04/15 10:05 (바깥 편집)