편집 :TypeScript 0.9.1 CommonJS : 외부 인터페이스를 구현하는 내 보낸 클래스를 올바르게 선언 했습니까?
을 넣어 '인터페이스'는 IInterface "를 구현하지 않는 클래스"MyClass에 " '는 .d.ts 내에서 컴파일러 오류 TS2137을 생산해서는 안 파일을 다음과 같은 또 다른 방법 :
interface IInterface {
someMethod():void;
}
declare module "mod" {
export class MyClass implements IInterface {
constructor();
}
}
왜냐하면 나는 아무것도 구현하지 못한다 (그리고 선언 할 수도 없다). 이것은 컴파일러의 버그입니까? 아니면 위의 내용을 수행하는 다른 방법/구문입니까? 필자는 컴파일러가 IInterface의 서명을 MyClass의 일부로 정확하게 포함하고 메서드를 다시 선언 할 필요가 없다는 것을 알기에 충분히 똑똑하다고 생각합니다.
ORIGINAL :
내가 노드 구성 요소 번연의 d.ts를 작성하는 것을 시도하고있다. 외부 인터페이스를 구현하는 클래스, 특히 노드의 EventEmitter를 확장하는 RingBuffer를 내보내는 데 문제가 있습니다. 간략화 문제 (a bunyan.d.ts 파일 이하)이다
: 다음에 myNodeApp.js에/// <references path="bunyan.d.ts" />
import bunyan = require('bunyan');
var rb = new bunyan.RingBuffer();
// compiler doesn't error on this; thinks RingBuffer is type any.
// also, no intellisense to show write() method.
rb.badFunc();
변화 bunyan.d.ts 사용
// this interface declared in <reference..., put inline here for simplicity
interface IExternal {
inheritedMethod():void;
}
interface RingBuffer extends IExternal {
write():void;
}
declare var RingBuffer: {
new():RingBuffer;
}
declare module "bunyan" {
export var RingBuffer;
}
declare module "bunyan" {
export class RingBuffer { constructor(); }
}
컴파일시 사용되지만 동일한 문제가 발생합니다. 인텔리 센스 없음, 컴파일 오류 없음.
declare module "bunyan" {
export var RingBuffer:RingBuffer;
}
원인
변화 bunyan.d.ts는 bunyan.d.ts로부터 제거 myNodeApp.js
// error TS2083: Invalid 'new' expression
import rb = new bunyan.RingBuffer();
의 컴파일 오류
declare module "bunyan" {
...
}
원인은 내가 상속 된 모든 메소드를 재 선언 할 필요가
interface IExternal {
inheritedMethod():void;
}
interface IRingBuffer extends IExternal {
}
declare module "bunyan" {
export class RingBuffer implements IRingBuffer {}
}
원인 오류
// error TS2137: Class "bunyan".RingBuffer declares interface IRingBuffer but
// does not implement it: type '"bunyan".RingBuffer' is missing property
// 'inheritedMethod' from type 'IRingBuffer'
의미를 컴파일
// error TS2071: Unable to resolve external module ''bunyan''
import bunyan = require('bunyan');
변경 bunyan.d.ts myNodeApp.js에서 오류를 컴파일 IRingBuffer 이외의 모든 확장 된 인터페이스에서 약간 우스운 것처럼 보입니다. d.ts 파일에서해야만합니다.
다른 CommonJS 모듈에서 사용하기위한 인터페이스를 구현하는 앰비언트 클래스를 선언하는 '올바른 방법'을 아는 사람이 있습니까 ??
감사 basarat. 정확히 컴파일러 버그입니까? 클래스를 선언하는 것이 d.ts 파일의 인터페이스를 구현하여 본질적으로 클래스 선언에서 인터페이스를 다시 선언 할 필요가 없기를 바랍니다. 선언문에서 '클래스 MyClass가 IInterface를 구현한다'고 말하면, IInterface에 대한 인터페이스 서명이 암시되어야하며, 다시 조사 할 필요가 없습니다. – user2672083
추가 조사 후 잘못된 것입니다. 솔루션으로 업데이트 된 답변 :) – basarat
[답변] (http://stackoverflow.com/a/14587529/1176284) 상속 된 멤버 선언이 앰비언트 선언에서 의무적 인 이유를 설명합니다. – rgripper