Другими словами следующее в течение .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?
благодаря basarat. Что такое ошибка компилятора? Я надеюсь, что это объявление класса для реализации интерфейса в файле d.ts, что мне не нужно существенно переопределять интерфейс в объявлении класса. Если в объявлении я скажу, что «класс MyClass реализует IInterface», его подпись интерфейса для IInterface должна подразумеваться и не должна быть введена снова и снова ... – user2672083
после дальнейшего расследования, я был неправ. Обновленный ответ с решением :) – basarat
Этот [ответ] (http://stackoverflow.com/a/14587529/1176284) объясняет, почему декларация о наследованном члене является обязательной в эмбиентной декларации. – rgripper