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);
ponieważ staje się modułem file: http://basarat.gitbooks.io/typescript/content/docs/project/modules.html – basarat
@ 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
@ askanison4 możliwe obejście może być usunięcie 'import * jako diff z 'diff ";' i używanie modułu diff jak 'diff.property' –