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.