2012-12-12 11 views
8

Czy istnieje sposób, aby importować lub opisywanie maszynopis moduły takie, że zewnętrzne moduły AMD zostaną automatycznie dołączone jako zależności podczas generowania moduł AMD kompatybilne ?:Automatycznie dołączasz depozyty AMD do modułu AMD Typescript?

tsc --module AMD example.ts 

Próbowałem to zarówno w tym odniesienie * .d.ts pliku i eksportujących Declare:

///<reference path='./lib/knockout-2.2.d.ts' /> 

export declare var $; 
export declare var _; 

export module example { 
    export class Example { 
     // whatever 
    } 
} 

jednak wygenerowany moduł nie obejmują one:

define(["require", "exports"], function(require, exports) { 
    (function (example) { 
     var Example = (function() { 
      function Example() { } 
      return Example; 
     })(); 
     example.Example = Example;   
    })(exports.example || (exports.example = {})); 
    var example = exports.example; 
}) 

Naprawdę chciałbym uniknąć tworzenia "fałszywych" modułów tutaj.

Wydaje się miły i wykorzystania rozwiązania byłoby umożliwienie importowania modułów AMD bezpośrednio:

var $ = import('jquery'); // This is a requirejs/AMD module, not a typescript file. 

ale nie wiem jak to możliwe, że jest.

Edit:

A ja też próbowałem wymienić takie podejście tutaj: Import TypeScript module using only ambient definition for use in amd

import knockout = module("./lib/knockout-2.2.d.ts"); 
... 

jednak uzyskać te błędy kompilatora:

example.ts(1,32): The name '"./lib/knockout-2.2.d.ts"' does not exist in the current scope 
example.ts(1,32): A module cannot be aliased to a non-module type 
+0

Znalazłeś dobre rozwiązanie dla tego? –

+0

Nie - w moim przypadku zacząłem zdawać sobie sprawę, że łatwiej było połączyć moją aplikację Typescript do pojedynczego pliku ('tsc --out'), zamiast martwić się o AMD, ponieważ nie było w nim leniwego ładowania. – 7zark7

+1

Właśnie znalazłem /// <ścieżka zależności amd = "ścieżka/do/nokaut/js" /> - ale mogę najpierw przetestować ją, kiedy wrócę do domu. –

Odpowiedz

3

W nowszych wersjach maszynopis poprawny sposób to zrobić jest ...

Przykład (dzieje się jQuery)

Krok 1: Pobierz plik definicji z Nuget (tj jQuery.maszynopis)

Krok 2: Oto kod (komentarz odniesienia nie jest konieczne w Visual Studio):

/// <reference path="scripts/typings/jquery/jquery.d.ts" /> 

import $ = require('jquery'); 

export module foo { 
    var elem = $('#myid'); 
} 

Powstały JavaScript:

define(["require", "exports", 'jquery'], function(require, exports, $) { 
    (function (foo) { 
     var elem = $('#myid'); 
    })(exports.foo || (exports.foo = {})); 
    var foo = exports.foo; 
}); 

Knockout

Niektóre ludzie mieli problemy z Knockoutem ... Ta sama technika działa dla Knockout ...

/// <reference path="scripts/typings/knockout/knockout.d.ts" /> 

import ko = require('knockout'); 

export module foo { 
    var obs = ko.observable('example'); 
} 

Powstały JavaScript:

define(["require", "exports", 'knockout'], function(require, exports, ko) { 
    (function (foo) { 
     var n = ko.observable('example'); 
    })(exports.foo || (exports.foo = {})); 
    var foo = exports.foo; 
}); 
4

to:

declare module 'jquery' { export var n; }; 

import $ = module('jquery'); 

export module foo { 
    var n = $.n; 
} 

spowoduje prawidłowe define rozmowy:

define(["require", "exports", 'jquery'], ... 

pamiętać, że jeśli nie używać importowaną wartość ($ w tym przykładzie) w pozycji wartość (w przeciwieństwie do tylko w pozycjach typu), przy czym kompilator zoptymalizuje tę zależność.

+0

Dzięki Ryan, zrobię to. Chociaż wiem, że przestrzeń modułu JS jest trochę chaotyczna w przypadku CommonJS, AMD, itp., A nie w przypadku błędu TypeScript - wydaje się, że warto włączyć moduły zewnętrzne w TS bez tych obejść. – 7zark7

+2

Cant dostać go do pracy na nokaut. przy imporcie ko = module ('knockout'), ko cant może być użyty jako ko.observable() after –

0

Odpowiedź Ryana zadziałała, z tym że nowy deklaruje ukrywa typy wymienione w potrójnie skomentowanym pliku ".d.ts".

Aby temu zaradzić, można spróbować zmienić declare tak:

declare module 'knockout' { export = knockout; } 

nie testowałem z nokautem ale rozwiązanie powinno działać z tym również.