2017-01-30 14 views
5

Po przeczytaniu this manual i ten cytat:Jaka jest różnica między `` deklarują namespace` i deklarują module`

Ważne jest, aby pamiętać, że w maszynopisie 1,5 nomenklatura ma zmieniło. "Moduły wewnętrzne" są teraz "przestrzeniami nazw". „moduły zewnętrzne” są teraz po prostu „moduły”

Byłem pod wrażeniem, że declare module nie jest już używany i został zastąpiony przez declare namespace jednak podczas zwiedzania node_modules\@types\node\index.d.ts widzę, że zarówno declare module i declare namespace służy:

declare namespace NodeJS { 
    export var Console: { 
     prototype: Console; 
     new(stdout: WritableStream, stderr?: WritableStream): Console; 
    } 
... 

declare module "buffer" { 
    export var INSPECT_MAX_BYTES: number; 
    var BuffType: typeof Buffer; 
    var SlowBuffType: typeof SlowBuffer; 
    export { BuffType as Buffer, SlowBuffType as SlowBuffer }; 
} 

Dlaczego tak jest? Co za różnica?

Moduły zewnętrzne (moduły ES6) nie są tutaj wchodzą w grę tutaj, jak rozumiem.

+0

Istnieje krótka definicja obu par akapitów w łączu, który masz w swoim poście. Zasadniczo przestrzenie nazw to sposób pisania skryptu implementującego wzorzec modułu. Moduły są teraz równoważne modułom ES2015. Część deklarowana oznacza, że ​​obie są obecne i zdefiniowane przez kogoś innego. :) – toskv

+0

@toskv, tak, na pewno przeczytałem stronę, z którą się łączyłem. Ale jest to bardzo mylące, dlatego wysłałem tutaj pytanie: –

+0

@toskv, Mam poprawną odpowiedź, zobacz [moja odpowiedź] (http://stackoverflow.com/a/42030656/2545680) –

Odpowiedz

3

Istnieją dwa sposoby określania modułów w TS:

declare module "buffer" {} // with quotes 

i

declare module buffer {} // without quotes 

Były (cytaty) oznacza moduł zewnętrzny (moduł ES6) i jest obecnie stosowany w .d.ts plików umieścić kilka modułów ES6 w jednym pliku:

declare module "buffer" {} 
declare module "fs" {} 

Te ostatnie (wi thout cytuje) użyto jako nazw i jest teraz zastąpiony

declare namespace buffer {} 

Więc w tym cytat:

Ważne jest, aby pamiętać, że w maszynopisie 1,5 nomenklatura ma zmieniło. "Moduły wewnętrzne" są teraz "przestrzeniami nazw". "Moduły zewnętrzne" są teraz po prostu "modułami"

"Moduły wewnętrzne" to moduły bez cytatów, ponieważ były używane przed 1.5.

Aby uzyskać dodatkowe informacje, patrz this issue.

+1

kiedy używać 'zadeklarować przestrzeń nazw xxx {}'? – novaline

+0

@novaline, sprawdź [to] (https://www.typescriptlang.org/docs/handbook/namespaces.html). Przestrzenie nazw są w zasadzie "wzorcem modułów odkrywania" w JS. Możesz zadać osobne pytanie, aby uzyskać więcej szczegółów i odnieść się do niego tutaj –

+1

Czytam oficjalny dokument, ale doktor nie wyjaśnia tego jasno. Jestem świadomy używania 'declare module 'xxx' {}'.Ale wciąż nie wiem, kiedy użyć 'declare namespace xxx {}' i jaki jest związek pomiędzy 'es6 module system' a globalnym' script' tag? – novaline

Powiązane problemy