2013-08-19 3 views
3

편집 :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 모듈에서 사용하기위한 인터페이스를 구현하는 앰비언트 클래스를 선언하는 '올바른 방법'을 아는 ​​사람이 있습니까 ??

+0

감사 basarat. 정확히 컴파일러 버그입니까? 클래스를 선언하는 것이 d.ts 파일의 인터페이스를 구현하여 본질적으로 클래스 선언에서 인터페이스를 다시 선언 할 필요가 없기를 바랍니다. 선언문에서 '클래스 MyClass가 IInterface를 구현한다'고 말하면, IInterface에 대한 인터페이스 서명이 암시되어야하며, 다시 조사 할 필요가 없습니다. – user2672083

+0

추가 조사 후 잘못된 것입니다. 솔루션으로 업데이트 된 답변 :) – basarat

+0

[답변] (http://stackoverflow.com/a/14587529/1176284) 상속 된 멤버 선언이 앰비언트 선언에서 의무적 인 이유를 설명합니다. – rgripper

답변

2

Jquery의 타이프 스크립트 정의가 정의되는 방식이 다른 방법으로 정의 될 수 있습니다. 정적 및 인스턴스 구성원에 대해 별도의 인터페이스가 있습니다.다음은 샘플 완전한 정의는 다음과 같습니다

interface IExternal { 
    inheritedMethod():void; 
} 

interface IRingBuffer extends IExternal { 
    write():void; 
} 
// Static functions and constructors 
interface IRingBufferStatic{ 
    new():IRingBuffer; 
} 
declare var RingBuffer:IRingBufferStatic; 

declare module "bunyan" { 
    export var RingBuffer:IRingBufferStatic; 
} 

// In the second file 

import bunyan = require('bunyan'); 
var rb = new bunyan.RingBuffer(); 

// you get an error here 
rb.badFunc(); 

Try it online

+1

그게 전부 야! 감사합니다 basarat, 많은 감사. – user2672083