Импортируйте модуль TypeScript, используя только определение окружения для использования в amd
У меня есть модуль, который зависит от Backbone
. У меня есть определение backbone.d.ts
, но TypeScript, похоже, не хочет компилировать мой модуль, если только
import Backbone = module("backbone")
фактически указывает на действительный базовый модуль, а не на файл определения. Я использую модули, загруженные AMD, и для прокси-сервера предусмотрена настройка requirejs.
Существует ли обходное решение, помимо создания определения модуля фальшивого базового модуля.
Обновление: Побочным эффектом решения является то, что такой код больше не работает, потому что модуль больше не существует. Он должен существовать из-за соответствия требованиям. Единственным обходным решением, которое я знаю, является наличие двух файлов .d.ts. Один для файла с использованием магистрали в качестве импорта, который не включает бит declare module
. Другой для использования /// <reference
, который включает строку declare module
.
/// <reference path="../dep/backbone/backbone.d.ts" />
interface IApi {
version: number;
Events: Backbone.Events;
}
Ответы
Ответ 1
Язык TypeScript изменил справедливый бит с момента этого оригинального ответа.
Например, для импорта внешнего модуля вы используете require
(у моего исходного ответа было старое ключевое слово module
):
Вот пример использования для импорта магистрали - использование информации о типе из определенно типизированного:
/// <reference path="scripts/typings/backbone/backbone.d.ts" />
import bb = require('backbone');
Внутри определения типа для вас объявлен магистральный модуль, что позволяет импортировать значение:
//... lots of code and then...
declare module "backbone" {
export = Backbone;
}
Итак, исходный вопрос можно решить, используя...
/// <reference path="scripts/typings/backbone/backbone.d.ts" />
import bb = require('backbone');
interface IApi {
version: number;
Events: bb.Events;
}
class Api implements IApi {
public version = 1;
public Events: bb.Events = null;
}
Для этого примера кода это все, что требуется - но чаще всего вам понадобится библиотека базовой библиотеки, загруженная во время выполнения... вы можете использовать (официально экспериментальный) комментарий amd-dependency
для создания сгенерированной функции define
звоните, чтобы включить магистраль.
/// <reference path="scripts/typings/backbone/backbone.d.ts" />
/// <amd-dependency path="backbone" />
import bb = require('backbone');
interface IApi {
version: number;
Events: bb.Events;
}
class Api implements IApi {
public version = 1;
public Events: bb.Events = null;
}
Ответ 2
Существует другой способ обработки amd in typescript:
-
Клонировать хранилище Github DefinitelyTyped. Он содержит jquery.d.ts
, backbone.d.ts
и многие другие файлы определений.
-
Свяжите файлы определения с файлом myfile.ts
:
/// <reference path="DefinitelyTyped/requirejs/require.d.ts" />
/// <reference path="DefinitelyTyped/jquery/jquery.d.ts" />
-
Добавить зависимость amd от библиотеки javascript:
/// <amd-dependency path="jquery"/>
-
Чтобы использовать $
внутри вашего файла myfile.ts
, теперь вы можете потребовать:
var $ = require("jquery");
Полная версия myfile.ts
:
/// <reference path="DefinitelyTyped/requirejs/require.d.ts" />
/// <reference path="DefinitelyTyped/jquery/jquery.d.ts" />
/// <amd-dependency path="jquery"/>
var $ = require("jquery");
export function helloWorld() {
$("<div>Hello World</div").appendTo(document.body);
}
Если вы запустите tsc --module amd myfile.ts
, вы получите следующий код javascript:
define(["require", "exports", "jquery"], function(require, exports) {
var $ = require("jquery");
function helloWorld() {
$("<div>Hello World</div").appendTo(document.body);
}
exports.helloWorld = helloWorld;
});