2017-11-17 2 views
0

TypeScript를 배우려면 TS Playground을 사용하고 있습니다. 이상한 점은 TypeScript가 인터페이스에 대한 특정 코드를 생성하지 않는다는 것입니다.TypeScript가 인터페이스 용 코드를 생성하지 않는 이유는 무엇입니까?

예 : 타이프가 interface에 대한 코드를 생성하지 않는 이유에 대한 설명이 있습니까

var p; 
p.id = 123; 
p.fullName = 'John Doe'; 
p.sayHello = function() { return "Hello from " + p.fullName; }; 

:

interface Person { 
    id: number, 
    fullName: string, 
    sayHello: Function 
} 

let p: Person; 
p.id = 123; 
p.fullName = 'John Doe'; 
p.sayHello = function() {return "Hello from " + p.fullName;} 

로 번역 할 것인가?

답변

2

TypeScript 유형 시스템은 TypeScript 자체의 범위에만 존재한다는 점을 기억하십시오.

결국 전체 자바 스크립트가됩니다. 컴파일러는 똑똑하고 필요할 때만 코드를 생성합니다. 즉, TypeScript의 유형 첵킹에 유용한 정보 만 포함하고 실제 JavaScript 코드가없는 인터페이스는 컴파일 후 JavaScript 코드가 생성되지 않습니다. 사용되지 않는 코드를 생성 할 이유가 없습니다.

모든 코드는 실제 JavaScript 호출없이 변수가 있어야하는 모든 인터페이스가 TypeScript에 알려줍니다. 컴파일러가 유형을 확인하기 위해 작업을 수행하면 인터페이스가 JavaScript에 존재할 이유가 없습니다.

2

TypeScript 컴파일러는 유형의 삭제 작업을 수행하여 출력에서 ​​모든 유형을 제거합니다 (아래 참고 참조). 이 두 가지 중요한 이유가있다 :

유형 정보가 논리적으로 자바 스크립트로 표현할 수없는
  1. 유형 정보가없는 런타임 컴파일러를위한 것입니다, 그래서이 출력에 필요하지 않은

런타임 형식 검사를 수행하기 위해 런타임에 TypeScript 형식을 가져 오려는 일부 프로젝트가 있었지만 솔직히이 점에 큰 식욕이 아니 었습니다. 우리는 완전히 동적 인 유형에서 디자인/컴파일 타임에 정적 유형 검사로 이동한다는 점을 감안할 때, 대부분의 사람들에게 큰 도약이 될 수 있습니다.

컴파일하는 동안 형식 만 제거 할 수있는 것은 아닙니다. 다른 예는 아래 예제의 name 속성과 같이 JavaScript 파일에서 찾을 수없는 초기화되지 않은 클래스 멤버입니다.

class Example { 
    public name: string; 
} 

const example = new Example(); 

console.log(example.name); 

그러나 애플리케이션에서 제거되는 대부분의 유형과 앰비언트 선언이됩니다.

아래의주의 사항

모든 유형이 지워졌습니까? 리플렉션과 함께 사용할 방출 유형 정보에 대한 실험적 지원이 있습니다.이 정보는 reflect-metadata 패키지로 시도 할 수 있습니다.

관련 문제