2016-10-16 3 views
1

У меня есть модуль, который определяет несколько классов, которые принимают параметры типа (<T>) и реализуют интерфейс (my_interface).Интерфейс для объекта, члены которого являются классами

// [my_module.ts] 
import {my_interface} from ".\typings.d.ts" 
export class Class_A <T> implements my_interface { 
    blah blah blah; 
} 
export class Class_B <T> implements my_interface { 
    blah blah blah; 
} 

и у меня есть .d.ts файл, который определяет интерфейсы для экземпляров класса:

// [typings.d.ts] 
export interface my_interface <T> { 
    blah:blah; 
} 

Я хочу добавить интерфейс, который описывает модуль в целом, но следующее поднимает «TS2304: Не удается найти имя «T». Ошибка:

// [typings.d.ts] 
export interface MY_MODULE { 
    Class_A: my_interface<T>; 
    Class_B: my_interface<T>; 
} 

и следующее поднимает "TS2314: Generic типа 'my_interface' требует 1 аргумент типа (ов)" ошибка:

// [typings.d.ts] 
export interface MY_MODULE { 
    Class_A: my_interface; 
    Class_B: my_interface; 
} 

Есть ли способ для создания интерфейса (MY_MODULE) чтобы описать объект, который импортируется, когда скомпилированный код JS импортируется через:

var my_module:MY_MODULE = require("my_module") 
+0

Не должно быть необходимости определять тип модуля, компилятор должен делать вывод о самом модуле. Если вам потом понадобится, вы можете сделать следующее: 'typeof my_module'. –

+0

Не когда модуль импортируется из скомпилированных JS-файлов, то есть когда модуль устанавливается через 'npm' или' bower'. Вот почему я пишу файл '.d.ts'. – Jthorpe

+0

Ну, вы пробовали ссылаться на файл определения: '/// '? –

ответ

1

я должен удивляться, если вы используете генериков многозначительно здесь. В любом случае, прошлое наименьшего сопротивления делать то, что вы хотели бы сделать, это: сделать MY_MODULE generic.

export interface MY_MODULE<T> { 
    Class_A: my_interface<T>; 
    Class_B: my_interface<T>; 
} 

После этого параметр будет правильно разрешен. В процессе импорта вы затем ввести его в качестве

var my_module:MY_MODULE<type-here> = require("my_module") 

если вы не волнует, что получает подается в него, идти вперед и делать

var my_module:MY_MODULE<any> = require("my_module") 

Это имеет некоторые последствия. Это означает, что type_A и type_B являются общими для одного и того же типа. Это предназначено? Если нет, то вместо того, чтобы использовать :my_interface<T> в аннотации типа, вы должны заполнить интересующий вас тип_A и type_B. Если вам все равно, вы можете снова использовать any.

Вы хотите подавить информацию о типе поставки до тех пор, пока он не будет использован? Возможно, типы A и B являются подобными коллекциями, и вы хотели бы, чтобы они переносили тип, который они инициализировали, на последующие вызовы функций. Вы можете достичь этого, как хорошо, но вам нужно использовать функцию, например:

interface ExampleModule { 
    Class_A: <T> (param: T) => my_interface<T> 
} 

или конструктор, таких как:

interface ExampleModule { 
    Class_A: { new<T>(): my_interface<T> }; 
} 

, а затем использовать созданный объект.

+0

Интерфейс конструктора - именно то, что я искал. Благодаря! – Jthorpe

Смежные вопросы