interface단순히 물체의 모양을 설명하고 싶을 때 사용합니다. 인터페이스에 대한 코드 생성은 없습니다. 유형 시스템의 아티팩트 일뿐입니다. implements절이 있는지 여부에 따라 클래스의 코드 생성에 차이가 없습니다 .
declare class외부에 존재할 기존 클래스 (일반적으로 TypeScript 클래스이지만 항상 그런 것은 아님) 를 설명하려는 경우 (예 : 두 개의 .js 파일로 컴파일되는 두 개의 .ts 파일이 있고 둘 다 script태그 를 통해 포함됨) 웹 페이지에서). classusing 에서 상속하는 경우 extends(기본 유형이 declare class또는 일반 인지 여부에 관계없이 class) 컴파일러는 프로토 타입 체인과 전달 생성자를 연결하는 모든 코드를 생성합니다.
declare class인터페이스 였 어야 하는에서 상속하려고하면 생성 된 코드가 런타임 매니페스트가없는 객체를 참조하므로 런타임 오류가 발생합니다.
반대로 단순히 implement이어야하는 인터페이스 인 경우 declare class모든 멤버를 직접 다시 구현해야하며 기본 클래스 및 함수에서 코드 재사용을 활용하지 않을 것입니다. 런타임에 프로토 타입 체인을 확인하면 실제로 기본 클래스의 인스턴스가 아닌 개체가 거부됩니다.
당신이 C ++ 배경이있는 경우, 정말 살아남을 얻으려면, 당신은 대략 생각할 수 interface로 typedef및 declare classint로서 extern엄격하게이 컴파일 단위의 정의를 결여 생성자의 선언.
순수한 소비 측면에서, 사이의 유일한 차이 (하지의 새로운 유형을 추가, 필수 코드를 작성) interface그리고 declare class당신이 할 수없는 그 new인터페이스. 당신이하려는 경우, extend/ implement새로운에서 이러한 유형 중 하나 class, 당신은 절대적 사이에 올바르게 선택한해야 interface하고 declare class. 그들 중 하나만 작동합니다.
당신에게 도움이 될 두 가지 규칙 :
- 유형의 이름이
new런타임에 실제로 존재 하는 생성자 함수 (로 호출 가능한 것)와 정렬되어 있습니까 (예 : 존재 Date하지만 JQueryStatic존재하지 않음)? 경우 에는 , 당신은 확실히 싶지interface
- 다른 TypeScript 파일에서 컴파일 된 클래스 또는 충분히 유사한 것을 다루고 있습니까? 만약 예 , 사용
declare class