2012-10-24 8 views
5

Nie można uzyskać żadnego importu do pracy, gdy moduł nie jest zdefiniowany jako ciąg. Co się dzieje?Użycie backbone.d.ts

test.ts

import b = module('Backbone') 

nie działa: backbone.d.ts

declare module Backbone { 

    export class Events { 
    ... 

Works: backbone.d.ts

declare module "Backbone" { 

    export class Events { 
    ... 

Edycja 1:

FYI Od 10.1.4

AmbientModuleIdentification z literał łańcuchowy deklaruje modułu zewnętrznego. Ten typ deklaracji jest dozwolony tylko w module globalnym. StringLiteral musi określać nazwę zewnętrznego modułu najwyższego poziomu. Względne nazwy modułów zewnętrznych nie są dozwolone

ja nie rozumiem, jak to jest przydatne do nie określić ją jako ciąg dosłownej formie, jak znaleźć here i here. Działa to, jeśli używasz ///<reference... bez modułu literału łańcuchowego, ale próbuję generować moduły AMD, które zależą od tych bibliotek, więc potrzebuję importu do pracy. Czy jestem mniejszością i muszę przejść i zmodyfikować każdy .d.ts, aby był wersją literową?

Edycja 2:

Deklarowanie modułu używającego ciąg dosłownego wymaga, że ​​import jest dokładne dopasowanie jeśli ciąg dosłowne. Nie można już używać względnych ani bezwzględnych ścieżek do położenia tej definicji modułu/modułu, nawet jeśli nie znajduje się on w tym samym katalogu, co plik, który próbuje go zaimportować. To sprawia, że ​​wymagany jest kod ///<reference i import, ale powstaje moduł, którego dokładnie poszukiwano z tsc --module AMD (ścieżka do modułu jest podyktowana przez literalny łańcuch modułu "Backbone").

Na przykład.

+- dep/ 
    |- backbone.d.ts 
|- test.ts 

backbone.d.ts:

declare module "Backbone" { 
    export class Events { 

Works: test.ts:

///<reference path="../dep/backbone.d.ts" /> 
import b = module('Backbone') 

// generates 
// define(["require", "exports", 'Backbone'] 

nie działa: badań.ts:

import b = module('./dep/Backbone') 

Zauważ, że to działa, jak również ...

declare module "libs/Backbone" { 
... 
///<reference path="dep/backbone.d.ts" /> 
import b = module('libs/Backbone') 
... 
// generates 
define(["require", "exports", 'libs/Backbone'] 
+1

Jestem bardzo ciekawy, aby uzyskać dobre wyjaśnienie również tego. Złożyłem [problem] (http://typescript.codeplex.com/workitem/231) w codeplex kilka tygodni temu, który był na podobny temat. Problem został zamknięty, a komentarz mówi, że ma coś wspólnego z różnicą między modułami wewnętrznymi i zewnętrznymi i że mają nadzieję poprawić swoją dokumentację wkrótce ... – Valentin

+0

Być może zechcesz spojrzeć na moje odkrycia 2 edycji – ryan

+0

Interesujące. Ciągle ciekawi mnie, dlaczego wiele deklaracji nie używa formatu literowego. – Valentin

Odpowiedz

1

Kiedy piszesz tak:

declare module Backbone { 

Oznacza to masz już moduł, który jest w zasięg globalny (dzięki czemu można go bez problemu używać, nie jest wymagany import). Ale kiedy to napiszesz:

declare module "Backbone" { 

Oznacza to, że będziesz określać wygląd importowanego modułu (import ... = moduł ("...")).

+1

Zaktualizowałem moje pytanie, jeśli masz jakieś dodatkowe myśli, proszę podziel się – ryan