Справочный модуль, экспортированный с помощью «export =» в TypeScript

Начиная с TypeScript 0.9, вы можете установить экспортируемое значение модуля напрямую, используя export =:

// client.ts 
class Client { 
    constructor(public name: string, public description: string) { } 
} 
export = Client; 

Есть ли способ сослаться на Client с помощью /// <reference ... />?

Следующее не предоставляет класс Client:

/// <reference path="./client.ts" />

class SomeClass {
    addClient(client: Client) { // Could not find symbol 'Client'
        ...
    }
}

Я предполагаю, что это ожидаемое поведение, поскольку я экспортирую прямую ссылку на класс Client, поэтому модуль в основном анонимен. Но в приведенном выше классе я на самом деле не создаю экземпляр нового Client, поэтому добавление import Client = require('Client'); позволит загрузчику AMD загрузить client.js, хотя в этом нет необходимости, если addClient никогда не вызывается.

Так что я надеялся на что-то вроде:

/// <reference path="./client.ts" export="Client" />

Где export будет именем для назначения модуля.


person sroes    schedule 01.09.2013    source источник
comment
Когда вы используете export =, он компилируется в модуль AMD. Тогда это внешний модуль, который вы должны использовать синтаксис import foo = require("bar"); для его импорта. JavaScript (и, следовательно, TypeScript) не может определить, действительно ли используется Client, поэтому вызов require будет на уровне файла. Если вы хотите иметь такую ​​гибкость, объявите Client интерфейс в файле определения типа .d.ts, а затем <reference> его.   -  person Stephen Chung    schedule 03.09.2013
comment
Да, я думаю (кроме импорта Client) это единственный вариант, спасибо.   -  person sroes    schedule 03.09.2013


Ответы (1)


/// <reference ... / не работает, когда у вас есть что-то экспортированное на уровне файла (называемое external modules в документации машинописного текста)

Измените свой код, чтобы он был:

// client.ts 
class Client { 
    constructor(public name: string, public description: string) { } 
} 
// Remove this line export = Client; 

Дополнительное объяснение: единственный способ получить доступ к элементам в файле после того, как вы экспортируете что-либо на корневом уровне файла, — это комбинация import/require.

PS: я сделал видео о внутренних/внешних модулях typescript: http://www.youtube.com/watch?v=KDrWLMUY0R0&hd=1

person basarat    schedule 01.09.2013
comment
Да, я использую requirejs. Используя export = , я могу предотвратить определение чего-либо в глобальной области видимости. Я заметил, что привел плохой пример, в котором я создал новый экземпляр Client, в этом случае ему действительно потребуется импорт. Я отредактировал свой вопрос, чтобы указать случай, когда Client может не понадобиться. - person sroes; 01.09.2013
comment
Да, кстати, я посмотрел 2 ваших видео на YouTube на эту тему. Они помогли мне понять, как работают модули TypeScript, спасибо за это! - person sroes; 01.09.2013
comment
Спасибо. Сделал мой ответ более явным. Единственный способ получить доступ к элементам в файле после того, как вы экспортируете что-либо на корневом уровне файла, - это комбинация импорта/требования. что вы можете сделать, это переместить класс в третий файл без экспорта и использовать его оттуда - person basarat; 01.09.2013
comment
Значит, единственный способ назначить Client параметру client — это добавить импорт? Это означало бы, что requirejs всегда будет загружать Client, когда загружается SomeClass, даже если в этом нет необходимости. - person sroes; 01.09.2013
comment
Да. Поскольку внешний модуль создает пространство имен, вы можете импортировать его только через require. - person basarat; 02.09.2013
comment
Хорошо спасибо. Я думаю, что для TypeScript будет хорошей возможностью ссылаться на внешний модуль. - person sroes; 02.09.2013