tutorial official language handbook example documenting con typescript tsc

typescript - official - ''No se puede volver a declarar la variable de ámbito de bloque'' en archivos no relacionados



typescript official documentation (2)

Hay un paquete TS simple que se usa como módulos CommonJS y no tiene exportaciones. Los archivos TS se compilan en archivos JS con el mismo nombre y se usan según sea require(''package/option-foo'') .

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;

La parte importante aquí es que option-foo y option-bar nunca se usan juntas . Hay otros archivos TS complementarios en el proyecto, pero no afectan nada, solo necesitan ser transpuestos a JS en una ejecución tsc .

Cuando tsc corre, arroja

No se puede volver a declarar la variable de ámbito de bloque ''GlobalVar''.

Implementación de funciones duplicadas.

No se puede volver a declarar la variable de ámbito de bloque ''GlobalVar''.

Implementación de funciones duplicadas.

para GlobalVar y baz en ambos archivos.

¿Cómo se puede tratar esto sin complicar el proceso de compilación o el resultado de estos dos archivos TS?


GlobalVar y las funciones están expuestas al espacio de nombres global, y TypeScript le advierte que la variable y el nombre del método se vuelven a declarar. Debido a que las dos funciones se declaran en el espacio de nombres global, solo necesita declararlas una vez.

Si desea hacer esto, use espacios de nombres.

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

Puede llamar a las funciones de la misma manera que las llama en C #, utilizando el nombre del espacio de nombres: bar.baz o foo.baz .


TL; DR Simplemente escriba export {} en el alcance más externo de sus archivos.

En algún momento debe haber una desambiguación semántica para saber si un archivo debe tratarse como un módulo (y tener su propio alcance) o un script (y compartir el alcance global con otros scripts).

En el navegador, esto es fácil: debe poder usar una etiqueta <script type="module"> y podrá usar módulos.

Pero, ¿qué pasa con cualquier otro lugar que utilice JavaScript? Desafortunadamente, no hay una forma estándar en este punto para hacer esa distinción.

La forma en que TypeScript decidió abordar el problema fue simplemente decir que un módulo es cualquier archivo que contiene una importación o exportación .

Entonces, si su archivo no tiene ningún tipo de declaraciones de import o export nivel superior, ocasionalmente verá problemas con las declaraciones globales interfiriendo entre sí.

Para evitar esto, simplemente puede tener una declaración de exportación que no exporta nada. En otras palabras, solo escribe

export {};

en algún lugar en el nivel superior de su archivo.