TypeScript에서 .d.ts 소스 선언 파일을 만들 때 어느 것이 바람직하며 그 이유는 무엇입니까?
declare class Example {
public Method(): void;
}
또는
interface Example {
Method(): void;
}
내가 말할 수있는 차이점은 인터페이스는 정적 메서드를 가질 수 없기 때문에 클래스를 사용해야한다는 것입니다. 둘 다 JS 출력을 생성하지 않으므로 중요하지 않습니까?
답변
interface
단순히 물체의 모양을 설명하고 싶을 때 사용합니다. 인터페이스에 대한 코드 생성은 없습니다. 유형 시스템의 아티팩트 일뿐입니다. implements
절이 있는지 여부에 따라 클래스의 코드 생성에 차이가 없습니다 .
declare class
외부에 존재할 기존 클래스 (일반적으로 TypeScript 클래스이지만 항상 그런 것은 아님) 를 설명하려는 경우 (예 : 두 개의 .js 파일로 컴파일되는 두 개의 .ts 파일이 있고 둘 다 script
태그 를 통해 포함됨) 웹 페이지에서). class
using 에서 상속하는 경우 extends
(기본 유형이 declare class
또는 일반 인지 여부에 관계없이 class
) 컴파일러는 프로토 타입 체인과 전달 생성자를 연결하는 모든 코드를 생성합니다.
declare class
인터페이스 였 어야 하는에서 상속하려고하면 생성 된 코드가 런타임 매니페스트가없는 객체를 참조하므로 런타임 오류가 발생합니다.
반대로 단순히 implement
이어야하는 인터페이스 인 경우 declare class
모든 멤버를 직접 다시 구현해야하며 기본 클래스 및 함수에서 코드 재사용을 활용하지 않을 것입니다. 런타임에 프로토 타입 체인을 확인하면 실제로 기본 클래스의 인스턴스가 아닌 개체가 거부됩니다.
당신이 C ++ 배경이있는 경우, 정말 살아남을 얻으려면, 당신은 대략 생각할 수 interface
로 typedef
및 declare class
int로서 extern
엄격하게이 컴파일 단위의 정의를 결여 생성자의 선언.
순수한 소비 측면에서, 사이의 유일한 차이 (하지의 새로운 유형을 추가, 필수 코드를 작성) interface
그리고 declare class
당신이 할 수없는 그 new
인터페이스. 당신이하려는 경우, extend
/ implement
새로운에서 이러한 유형 중 하나 class
, 당신은 절대적 사이에 올바르게 선택한해야 interface
하고 declare class
. 그들 중 하나만 작동합니다.
당신에게 도움이 될 두 가지 규칙 :
- 유형의 이름이
new
런타임에 실제로 존재 하는 생성자 함수 (로 호출 가능한 것)와 정렬되어 있습니까 (예 : 존재Date
하지만JQueryStatic
존재하지 않음)? 경우 에는 , 당신은 확실히 싶지interface
- 다른 TypeScript 파일에서 컴파일 된 클래스 또는 충분히 유사한 것을 다루고 있습니까? 만약 예 , 사용
declare class
답변
인터페이스를 구현할 수 있습니다.
class MyClass implements Example {
Method() {
}
}
declare class
구문은 실제로 TypeScript로 작성되지 않은 외부 코드에 대한 유형 정의를 추가하는 데 사용되는 반면, 구현은 “다른 곳”입니다.
답변
평신도의 용어로, / 파일 declare
에서 사용되어 현재 파일에 정의되어 있지 않더라도 해당 환경에 존재 해야하는 키워드를 컴파일러에 알려야 합니다. 그러면 Typescript 컴파일러가 이제 다른 구성 요소가 해당 변수를 제공 할 수 있음을 알고 있으므로 선언 된 개체를 사용할 때 형식 안전성을 가질 수 있습니다..ts
d.ts
declaring
답변
차이 declare
와 interface
TS에서 :
알리다:
declare class Example {
public Method(): void;
}
위의 코드 declare
에서 TS 컴파일러는 클래스 Example
가 선언 된 곳을 알 수 있습니다 . 이것은 클래스가 마술처럼 포함된다는 것을 의미하지 않습니다. 프로그래머는 ( declare
키워드로) 선언 할 때 클래스를 사용할 수 있도록해야합니다 .
상호 작용:
interface Example {
Method(): void;
}
은 interface
단지 타이프 내에 존재하는 가상 구조이다. 타입 스크립트 컴파일러는 타입 검사의 목적으로 만 이것을 사용합니다. 코드가 자바 스크립트로 컴파일되면이 전체 구조가 제거됩니다. 타입 스크립트 컴파일러는 개체의 구조가 올바른지 확인하기 위해 인터페이스를 사용합니다.
예를 들어 다음 인터페이스가있는 경우 :
interface test {
foo: number,
bar: string,
}
이 인터페이스 유형을 가진 우리가 정의하는 객체는 인터페이스와 정확히 일치해야합니다.
// perfect match has all the properties with the right types, TS compiler will not complain.
const obj1: test = {
foo: 5,
bar: 'hey',
}
답변
