2016-12-01 9 views
17

Istnieje prosty pakiet TS, który jest używany jako moduły CommonJS i nie ma eksportu. Pliki TS są kompilowane do plików JS o tej samej nazwie i używane jako require('package/option-foo')."Nie można ponownie określić zmiennej blokowej" w plikach niepowiązanych.

tsconfig.json:

{ 
    "compilerOptions": { 
    "target": "es5" 
    } 
} 

Option foo.ts:

declare const GlobalVar: any; 

function baz() {} 

if (GlobalVar.foo) GlobalVar.baz = baz; 

Option bar.ts:

declare const GlobalVar: any; 

function baz() {} 

if (GlobalVar.bar) GlobalVar.baz = baz; 

Ważną częścią jest to, że option-foo i option-barnigdy nie używane razem. W projekcie są inne bezpłatne pliki TS, ale one nie mają wpływu na nic, tylko trzeba je przesłać do JS w jednym biegu tsc.

Kiedy tsc biegnie, rzuca

Nie można redeclare blok o zasięgu zmienna 'GlobalVar'.

Duplikowanie implementacji funkcji.

Nie można redeclare o zmiennej "GlobalVar" o ograniczonym zasięgu.

Duplikowanie implementacji funkcji.

dla GlobalVar i baz w obu plikach.

Jak można to traktować bez komplikowania procesu kompilacji lub danych wyjściowych z tych dwóch plików TS?

+0

W tym konkretnym przypadku możesz mieć plik 'custom-typings.d.ts' i zadeklarować go tam, jeśli oba są" dowolne ". Możesz także spróbować zmienić żądaną kompilację '--module' (spróbuj AMD/System, ponieważ uważam, że indywidualnie dopasowują pliki). – Seiyria

Odpowiedz

32

TL; DR Wystarczy napisać export {} w najbardziej zewnętrznym zakresie twoich plików.


W pewnym momencie nie musi być semantyczny ujednoznacznienie za czy plik powinien być traktowany jako modułu (i mieć swój własny zakres) lub skrypt (i dzielić globalny zasięg z innych skryptów).

W przeglądarce jest to proste - powinieneś być w stanie użyć znacznika <script type="module">, a będziesz mógł korzystać z modułów.

Ale co z każdym innym miejscem, które wykorzystuje JavaScript?Niestety w tym momencie nie ma standardowego sposobu dokonywania tego rozróżnienia.

Sposób, w jaki TypeScript zdecydował się rozwiązać problem polegał po prostu na stwierdzeniu, że moduł jest dowolny plik, który zawiera import lub eksport.

Jeśli Twój plik nie ma żadnych instrukcji najwyższego poziomu import lub export, to od czasu do czasu pojawią się problemy z globalną deklaracją, które zakłócają nawzajem.

Aby obejść ten problem, można łatwo uzyskać oświadczenie export, które nie eksportuje niczego. Innymi słowy, po prostu napisz:

gdzieś na najwyższym poziomie pliku.

+0

Po drugie, skończyłem z tym rozwiązaniem, po prostu działa. Dzięki. – estus

+0

To jest najlepsze wyjaśnienie tego problemu. Ten problem dezorientuje mnie przez długi czas. Dzisiaj w końcu znajduję powód. – novaline

+0

, więc to kompilator TS, który narzeka, a nie problem w czasie wykonywania, denerwujący. Czy istnieje sposób, aby zignorować takie błędy TS? –

8

GlobalVar i funkcje są narażone na działanie globalnej przestrzeni, a maszynopis ostrzega, że ​​zmienna i nazwa metody są ponownie zadeklarowane jako takie. ponieważ dwie funkcje są zadeklarowane w globalnej przestrzeni nazw, wystarczy zadeklarować jeden raz. Jeśli chcesz to zrobić. Użyj nazw

namespace foo{  
    declare const GlobalVar: any; 
    function baz() {} 

} 

namespace bar{ 
declare const GlobalVar: any; 
function baz() {} 
} 

można wywołać funkcję w C# przy użyciu nazwy przestrzeni nazw przed bar.baz, foo.baz

Nadziei to pomóc

Powiązane problemy