2013-08-19 5 views
3

EDIT:TypeScript 0.9.1 CommonJS: правильно объявляет экспортированный внешний класс, реализующий внешний интерфейс?

Другими словами следующее в течение .d.ts файл не должен производить ошибку компилятора TS2137 'класса "MyClass" не реализует интерфейс "IInterface"':

interface IInterface { 
    someMethod():void; 
} 
declare module "mod" { 
    export class MyClass implements IInterface { 
     constructor(); 
    } 
} 

потому что я не (и не могу в декларации) ничего реализовать. Это ошибка в компиляторе или есть какой-то другой способ/синтаксис для выполнения того, что подразумевается выше? Я бы подумал, что компилятор достаточно умный, чтобы точно указать подпись IInterface как часть MyClass, и не требует, чтобы его методы были переоформлены.

ORIGINAL:

Я пытаюсь написать d.ts для компонента узла Буньяна. Возникла проблема с экспортом класса, который реализует внешний интерфейс, в частности RingBuffer, который расширяет EventEmitter узла. Проблема упрощается это (ниже в файле 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; 
} 

затем используется в 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 к:

declare module "bunyan" { 
    export class RingBuffer { constructor(); } 
} 

компилируется, но такой же проблема при использовании; нет intellisense, ошибок компиляции.


изменение bunyan.d.ts к

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

причины ошибка компиляции в myNodeApp.js

// error TS2083: Invalid 'new' expression 
import rb = new bunyan.RingBuffer(); 

удаления из bunyan.d.ts

declare module "bunyan" { 
    ... 
} 

причины ошибки компиляции в myNodeApp.js

// error TS2071: Unable to resolve external module ''bunyan'' 
import bunyan = require('bunyan'); 

изменения bunyan.d.ts

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' 

подразумевая, что я должен переопределить все наследуемые методы из всех расширенных интерфейсов, кроме 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

Thats it! Спасибо basarat, очень ценится. – user2672083