2015-09-11 17 views
6

Mam bardzo mały projekt węzeł maszynopis o następującej strukturze:Dlaczego importowanie modułu węzła łamie moje wewnętrzne przestrzenie nazw maszynopisu w maszynie atomowej?

App structure

Podczas próby importowania moduł „diff” W mojej index.ts plik tak:

import * as diff from 'diff'; 

Atom -typescript nagle traci zdolność lokalizowania mój "fgtApp.Interfaces" nazw:

Loses autocomplete of internal namespace

Jak tylko wyjąć instrukcję import, węzeł jest w stanie rozwiązać „fgtApp.Interfaces” przestrzeni nazw nie problem tak:

Autocomplete working properly without import declaration

Jest to błąd w Atom maszynopisu lub błąd w moje rozumienie sposobu importowania tych modułów zewnętrznych?

+1

ponieważ staje się modułem file: http://basarat.gitbooks.io/typescript/content/docs/project/modules.html – basarat

+0

@ basarat, więc nie ma mowy, żeby to ZNAKOWANIE działało? Wygląda na to, że naprawdę pomoże to utrzymać porządek w kodzie. Napisałem podobne pytanie tutaj: http://stackoverflow.com/questions/34852909/using-angular-2-with-typescript-and-namespaces – Askanison4

+0

@ askanison4 możliwe obejście może być usunięcie 'import * jako diff z 'diff ";' i używanie modułu diff jak 'diff.property' –

Odpowiedz

6

To nie jest problem z maszynopisem. Wtyczka atom-maszynopis używa oficjalnej usługi języka TypeScript (takiej samej jak Visual Studio), więc byłby to problem w dowolnym edytorze.

Problem polega na tym, że po określeniu importu lub eksportu plik staje się modułem ("moduł zewnętrzny" pre-TypeScript 1.5). Oznacza to, że gdy import * as diff from 'diff'; jest obecny, rzeczy zadeklarowane w index.ts stają się tylko lokalne i nie uwzględniają/scalają się z globalną przestrzenią nazw.

maszynopis Spec, sekcja 11.1: ... pliki źródłowe, które zawierają co najmniej jeden zewnętrzny deklaracji celnych, cesja eksport lub najwyższego poziomu deklaracja eksportowane są traktowane jako oddzielne moduły zewnętrzne. Podmioty zadeklarowane w module zewnętrznym są w zakresie tylko w tym module, ale eksportowane podmioty mogą być importowane do innych modułów za pomocą deklaracji przywozowych

Kiedy nie używasz zewnętrznych modułów, maszynopis pozwala nazw w różnych plików do budować na sobie nawzajem. Gdy zaczniesz używać modułów zewnętrznych, nie będzie to już miało miejsca bez użycia obejść. W takim przypadku najlepiej jest po prostu przejść do korzystania z modułów zewnętrznych - jeśli tworzysz projekt węzła, jest to szczególnie łatwe, ponieważ nie musisz się martwić o sprzedaż pakietową.

Zamiast "głębokiej przestrzeni nazw" (np. FgtApp.category.thing), takich jak zachęty C# i .NET - zacznij myśleć o każdym źródłowym pliku TypeScript jako swoim własnym module. Jeśli naprawdę potrzebujesz hierarchii, implementuj ją ze strukturą folderów.

Ten kod będzie działać jak można się spodziewać nawet z noImplicitAny czynnej:

interfaces.d.ts

// Notice that this is a d.ts file. Since it will only contain interfaces, 
// making it a d.ts file means TypeScript doesn't have to worry about 
// emitting it and you also can't accidentally put executable code here. 
export interface IFgtService { 
    authenticateDisable: boolean; 
    failedAttempt: boolean; 
    authenticate: (username: string, password: string) => boolean; 
} 

export interface IAnotherInterfaceAsAnExample { 
    isCool: boolean; 
} 

serwis.ts

// since there is no "relative path", diff will come from node_modules. 
import * as diff from 'diff'; 
// since there IS a relative path, interfaces will come from ./interfaces.d.ts 
import * as interfaces from './interfaces'; 

// You can still use namespaces inside an "external module", but mainly they 
// serve as a convenient way to bundle stuff for a one-line export (see 
// the last line of this file). 
namespace Service { 
    export class FgtService implements interfaces.IFgtService { 
    authenticateDisable = true; 
    failedAttempt = true; 
    authenticate = (username: string, password: string) => { 
     let d = diff.d; 
     return true; 
    } 
    } 
} 
export = Service; 

index.ts

import {FgtService} from './Service'; 

const myService = new FgtService(); 
console.log(myService.authenticateDisable); 
+0

Z ciekawości; wspominasz o obejściach. Co by to było? UWAGA: Podniosłem podobne pytanie: http://stackoverflow.com/questions/34852909/using-angular-2-with-typescript-andnamespaces – Askanison4

+0

Przykładem obejścia może być zapisanie całego kodu w sposób globalnej przestrzeni nazw, a następnie zapisanie preprocesora w celu scalenia przestrzeni nazw w ramach zestawu modułów w stylu zewnętrznym. Nie chciałem wskazać, że to będzie łatwe lub dobrze przygotowane. – NYCdotNet

Powiązane problemy