Импортируйте модуль TypeScript, используя только определение окружения для использования в amd - программирование
Подтвердить что ты не робот

Импортируйте модуль 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;
}
4b9b3361

Ответ 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

Существует другой способ обработки in :

  • Клонировать хранилище 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;
});