Typescript: Error "No se pueden compilar los espacios de nombres" con --isolatedModules y sin espacios de nombres

Creado en 17 abr. 2017  ·  52Comentarios  ·  Fuente: microsoft/TypeScript

Versión de TypeScript: nightly (2.3.0-dev.20170417)

Código

function f() {}

Comportamiento esperado:

Ningún error o un mensaje de error sobre un archivo que no es un módulo en un proyecto --isolatedModules .

Comportamiento real:

src/a.ts(1,1): error TS1208: Cannot compile namespaces when the '--isolatedModules' flag is provided.

Esto ocurre porque en program.ts verifyCompilerOptions para buscar cualquier archivo fuente que no sea una declaración de módulo externo, y fallamos en el primero, cualquiera que sea.
El mensaje de error debe actualizarse para reflejar la verdadera razón por la que emitimos este error y no mencionar los espacios de nombres.
Alternativamente, podríamos permitir archivos sin importaciones y buscar un espacio de nombres antes de agregar este error.

Bug Error Messages help wanted

Comentario más útil

A global file cannot be compiled using '--isolatedModules'. Ensure your file contains imports, exports, or an 'export {}' statement.

Todos 52 comentarios

El mensaje de error debe ser más claro. en lugar de namespaces puede decir non-module . @DanielRosenwasser recomendaciones?

No debería haber un mensaje de error en esta situación. La opción --isolatedModules debería simplemente apagar el sistema del módulo interno por completo, si tsc aún falla de esta manera, la opción no hizo su trabajo.

En # 15839 tenía la intención de modificar el comportamiento de verificación, pero luego me di cuenta de que esta verificación no tiene sentido y que la solución ideal es eliminarla.
TypeScript siempre ha permitido el uso del espacio de nombres dentro de un módulo externo con --isolatedModules en:

export function something() {} // export found, so this module is considered 'external'
namespace ns {} // namespace is still valid in an external module

Por lo tanto, el cheque no hace nada en ese caso (aparentemente no válido), cuando se supone que debe quejarse. Entonces, ¿por qué quejarse cuando el programador ni siquiera está usando ningún espacio de nombres, sin hacer nada malo?

@wilonth El motivo de este problema es que el mensaje de error es incorrecto: los espacios de nombres están perfectamente bien si forman parte de un módulo (es6), pero cualquier archivo que no sea un módulo debería ser un error.

@ andy-ms Estaba tratando de señalar que todo el código para verificar este error es inútil, y deberíamos eliminarlo en lugar de complicar más el código.
Mi punto es que, cuando --isolatedModules está activado, cada archivo debe considerarse como un módulo externo (ES6), punto. En ese sentido, el uso de espacios de nombres debería ser legal porque en este momento, es perfectamente legal usar espacios de nombres dentro de los módulos ES6 (con --isolatedModules activado).

Mi punto es que, cuando --isolatedModules está activado, cada archivo debe considerarse como un módulo externo (ES6), punto.

La semántica aquí es que un módulo es un archivo con al menos una importación o exportación de nivel superior. no importa cómo invoques el compilador.

@mhegazy Sí y esa regla es exactamente la raíz del problema que tenemos aquí. La regla trata injustamente un archivo sin importar o exportar como parte del sistema de módulo interno heredado, por lo que --isolatedModules rechaza el archivo.
Ahora no deberíamos cambiar la regla porque eso probablemente romperá muchas cosas, pero podemos resolver el problema actual muy fácilmente simplemente eliminando este mensaje de error.
Imaginemos que se elimina este mensaje de error "no se pueden compilar espacios de nombres", ¿qué podría salir mal? ¿Qué pasa con una base de código que utiliza un módulo interno, como el propio compilador Typecript? Con --isolatedModules activado, ¿se compilaría en código basura y confundiría al usuario? No, no lo hará, habría muchos mensajes de error de Typecript sobre símbolos indefinidos, porque --isolatedModules rompió los enlaces entre los archivos, bastante obvio de entender.
¿Puede encontrar ALGUNA desventaja al eliminar este mensaje de error? No pude. ¿Por qué no elegiríamos la solución más sencilla, que no implica ningún trabajo (simplemente elimine las líneas) y no tiene inconvenientes?

Con --isolatedModules activado, ¿se compilaría en código basura y confundiría al usuario? No, no lo hará

Sí, lo hará.

El objetivo de la bandera --isolatedModules es validar que un programa se puede compilar correctamente mediante la transpilación de un solo archivo.

El código base de TypeScript no se puede compilar correctamente a través de la transpilación de un solo archivo. Hay un código como este en todas partes:

archivo1

namespace ts {
  export var x = 10;
}

archivo2

namespace ts {
  var y = x; // transpiles to ts.x during whole-program compilation
}

Si hacemos un archivo transpilado de un solo archivo, se rompería.

Mi mal, arruiné mis pruebas. Por la presente, me retracto de mi propuesta. Gracias @RyanCavanaugh por recordármelo.

Entonces, la solución debería ser: detectar el uso real del espacio de nombres antes de lanzar este mensaje de error (es decir, la solución "alternativa" que propuso @ andy-ms). No podemos simplemente cambiar el texto a otra cosa porque un mensaje de error en este caso es totalmente incorrecto.
Quiero hacer un PR, pero ¿todavía se puede confiar en mí después de escupir toda esa mierda?

A global file cannot be compiled using '--isolatedModules'. Ensure your file contains imports, exports, or an 'export {}' statement.

Si hacemos un archivo transpilado de un solo archivo, se rompería.

Perdón por la nigromancia, pero seguramente esto debería, al apuntar a módulos, fallar con algo como 'x' is not defined ? Ese caso no me parece diferente a lo trivial:

archivo1

var x = 10;

archivo2

var y = x;

Que también funciona cuando se concatena / evalúa globalmente y no con módulos; nada que ver con namespaces .

Esencialmente, ¿por qué el mecanografiado se molesta en adivinar que los archivos sin import o export no son módulos, cuando ya debería saberlo por la opción del compilador module ? Por ejemplo, TypeScript se compila sin establecer module , por lo que utiliza el valor predeterminado none , por lo que el compilador puede asumir la concatenación / evaluación global.

Cuando se usa --module <something> y se usan declaraciones no importadas de otros archivos, (incluidos los espacios de nombres), el mecanografiado ya fallará con "no definido" antes de --isolatedModules , y lo mismo después con el export {} solución alternativa, por lo que esto no parece una ruptura de compatibilidad para eliminar esta suposición, ¿me estoy perdiendo algo?

Me di cuenta de que, por alguna razón, todavía puedes usar import / export con --module none --isolatedModules , lo cual es bastante confuso, ¿posiblemente un error?

@DanielRosenwasser como usuario final: ¿qué significa "Un archivo global"? Aunque me gusta la guía. Quizás más como "Los archivos sin declaraciones de importación o exportación no son módulos y no se pueden compilar con '--isolatedModules'. Agregue una declaración 'export {}' si este archivo solo se evalúa por sus efectos secundarios". - aunque el idioma no parece muy mensaje de error-y.

Veo el mismo error para un proyecto js simple. Acabo de crear un proyecto js de muestra a continuación: el contenido del paquete y los archivos de script. ¿Cómo puedo resolver este problema?

Package.json
{
"plnkr": {
"runtime": "sistema"
}
}

lib / script.js
//
//Veintiuna
// por Dheeraj Kumar
//

let card1 = "As de espadas",
card2 = "diez de corazones";

console.log ('¡Bienvenido al Blackjack!');

console.log ("Te repartieron:");
conosle.log ("" + tarjeta1);
console.log ("" + tarjeta2);

¿Alguna actualización sobre esto?

A menudo me encuentro haciendo esto en pequeñas pruebas.

describe('jest', () => {
  it('finds this test', () => {
    expect(true).toBeTruthy();
  });

  it('parses this typescript', () => {
    const actual: number = 0;
    const expected: number = 0;
    expect(actual).toEqual(expected);
  });
});

export {
  // Use an empty export to please Babel's single file emit.
  // https://github.com/Microsoft/TypeScript/issues/15230
}

Realmente quiero una opción que haga que TypeScript considere cada archivo .ts como un módulo ES6, independientemente de si contiene declaraciones de importación / exportación o no. Originalmente asumí que la opción --isolatedModules era esa opción, pero causa este error extremadamente confuso en los archivos de importación / exportación. (Todavía no entiendo qué significa el mensaje de error con espacios de nombres. No creo que esté usando esa función). La razón por la que quiero esta configuración es porque he tenido varios problemas que TypeScript no ha detectado porque accidentalmente hice referencia una variable de nivel superior de un archivo .ts en otro (que ambos no tenían declaraciones de importación / exportación, por lo que TypeScript no los trató como módulos ES6) a pesar de usar node / parcel / webpack donde los archivos no pueden hacer referencia a los de otros variables no exportadas como esa.

Terminé aquí mientras intentaba arreglar una especie de molestia relacionada. Los comentarios a continuación son solo para ayudar a cualquier otro usuario de VS Code que busque este error con create-react-app y TypeScript.

Al configurar un proxy con create-react-app 2.xy TypeScript, agrega un archivo llamado setupProxy.js con un código como este:

const proxy = require('http-proxy-middleware');
module.exports = function(app) { /* ... */ };

react-scripts lee este archivo fuera del proceso de transpilación ts, por lo que debe ser js simple.

Esto funciona exactamente como se documenta , pero tiene un efecto secundario molesto.

El tsconfig.json generado por react-scripts incluye todos los archivos en src , incluidos setupProxy.js . Como resultado, activa VS Code para mostrar el error Cannot compile namespaces... en setupProxy.js , marcar el código con un garabato rojo e incluirlo en el panel Problemas. En mi configuración, también resalta el archivo y todas sus carpetas ancestrales en rojo.

Solución: suprima el mensaje de error VS Code excluyendo el archivo setupProxy.js en tsconfig.json.

{
  // ...
  "exclude": ["src/setupProxy.js"]
}

react-scripts fuerza isolatedModules: true , pero no parece sobrescribir exclude .

Alternativa: agregue una exportación con nombre a `setupProxy.js:

export const _ = '';

Con una exportación de nivel superior, ahora es válido con --isolatedModules.

Muy a menudo, los desarrolladores reciben este mensaje porque hay archivos que no deberían incluirse en la copia (gulp.js, etc.)

ATENCIÓN: si está utilizando una aplicación create-react-app y ve este problema como yo ... pude evitarlo haciendo un cambio en mi archivo tsconfig.json ...

Cambiar lo siguiente

    "isolatedModules": true,

a

    "isolatedModules": false,

@UncleFifi Y luego el error se mueve de la verificación de tipo a la transformación de babel mecanografiado, vea la primera advertencia .

@jtbennett , simplemente no puedes exportar nada con export {}; - la forma degenerada de export { name, localName as exportName };

@UncleFifi Y luego el error se mueve de la verificación de tipo a la transformación de babel mecanografiado, vea la primera advertencia .

Solo si realmente estás usando espacios de nombres. Este problema se trata principalmente de este error que se queja de que los espacios de nombres surgen cuando ni siquiera estás usando espacios de nombres y simplemente tienes un archivo legal con importación / exportación.

Solo si realmente estás usando espacios de nombres. Este problema se trata principalmente de este error que se queja de que los espacios de nombres surgen cuando ni siquiera estás usando espacios de nombres y simplemente tienes un archivo legal con importación / exportación.

Bien, lo siento, ¡ha pasado un tiempo desde que leí este hilo! Dicho esto, la razón por la que establecieron --isolatedModules en CRA es porque emula de cerca las limitaciones del mecanografiado de babel (dado que babel también es una transpilación de un solo archivo), por lo que al menos debe tener en cuenta que está eliminando esa protección. carril.

Entonces, ¿la solución actual al error Cannot compile namespaces when --isolatedModules flag is provided es agregar export {}; en la parte superior del archivo?

Sí, eso solucionará el problema. (Suponiendo que no esté usando TypeScript namespace . De lo contrario, tiene un problema diferente y probablemente legítimo).

Me encontré con este mensaje debido a que un archivo era un archivo "vacío" (es decir, todo el archivo fue comentado). Estoy feliz de que TS captó esto, pero el mensaje de error fue extremadamente opaco (y los colores se rompieron en una instalación básica de CentOS 7, pero esto probablemente se deba al servidor de desarrollo de paquetes web, no relacionado con TS directamente)

screen shot 2019-02-06 at 14 20 14

_Editar: no se puede reproducir. Definitivamente estaba mirando el archivo que consta de solo tres exportaciones de nivel superior y tuve este error, pero aprendí que hice algo mal en otro lugar.

Este error me acaba de ocurrir con un archivo que tiene exportaciones de nivel superior.

// Cannot compile namespaces:
export const foo = 'foo';

// Compiles fine
const foo = 'foo';
export { foo };

@ denis-sokolov Pregunta obvia: ¿también tiene otras cosas en ese archivo, como espacios de nombres?

Si es literalmente solo el export const , mi segunda suposición sería que el mecanografiado se está utilizando en algo como el paquete web con ts-loader, y solo está viendo el contenido después de la pasada anterior (por ejemplo, babel-loader) que se expande export de alguna manera, pero eso es un poco exagerado.

Ya no puedo reproducirlo. Lo siento, @simonbuchan , por la falsa alarma.

No tengo idea de por qué recibo este error en ese archivo específico.
Otros archivos se comportan bien

screen shot 2019-02-18 at 12 49 07
screen shot 2019-02-18 at 12 48 34

Estoy en una situación en la que estoy usando CRA TypeScript e importando un paquete que no tiene @types . Quiero agregar declare module 'package' para proporcionar mis propios tipos, pero no puedo poner esta declaración en ningún archivo de módulo. Así que sigo adelante y creo types.ts para colocar la instrucción declare module allí. Ahora recibo este error.

Cuando anulo isolatedModules a false , CRA lo cambia de nuevo por mí. Ésa no es una solución.

Cuando agrego export {} al archivo types.ts con declare module , obtengo un nombre de módulo no válido en el aumento. en lugar. Este error se evita colocando la declaración en un archivo que no es de módulo, pero CRA a través de esta configuración isolatedModules forzada obliga a cada archivo a ser un módulo.

Entonces, hay un camino circular para resolver un error solo para aterrizar en otro y regresar. ¿Como puede ésto ser resuelto?

@Bnaya en una conjetura, ¿los archivos que funcionan están usando declaraciones de importación o exportación? Solo use uno de require()/module.exports y import/export en su código. De lo contrario, verifique que todos sus archivos estén cubiertos por tsconfig include (consulte los documentos para obtener detalles completos sobre eso

Las declaraciones del módulo
Solo hice que CRA volviera a agregar las configuraciones que eliminé, no las volví a cambiar, pero ¿quizás sea más insistente para los módulos aislados?

@simonbuchan Probé un .d.ts pero tampoco funcionó para mí, informaré por qué exactamente, no estoy seguro de qué fue. Y de hecho, CRA reescribió ese escenario para mí.

@simonbuchan he probado todo lo anterior de

@simonbuchan Hmm bien, entonces .d.ts funciona, puedo declarar el módulo allí y escribirlo. La razón por la que originalmente lo abandoné es porque para los mecanografiados que quiero declarar en ese módulo, necesito hacer referencia a otros mecanografiados, pero al introducir import en el archivo .d.ts hace que deje de funcionar. No sé cómo resolver esto, pero esa es mi falta de conocimiento de TypeScript que ya no tiene nada que ver con este error.

Aquí hay un caso de reproducción mínima, usando mecanografiado @ next (repositorio completo en https://github.com/yang/sandbox-ts-namespaces-error):

src / a.js: (aviso, no se necesitan palabras clave de importación / exportación)

module.exports = "hello"; // you could really put anything here, e.g. console.log('hello');

tsconfig.js:

{
  "compilerOptions": {
    "allowJs": true,
    "isolatedModules": true,
    "noEmit": true,
    "strict": true
  },
  "include": ["src"]
}

Error:

$ ./node_modules/.bin/tsc
src/a.js:1:1 - error TS1208: Cannot compile namespaces when the '--isolatedModules' flag is provided.

1 module.exports = "hello";
  ~~~~~~


Found 1 error.

Yo también encontré esto por primera vez a través de create-react-app --typescript , que le indica que cree un setupProxy.js (o setupTests.js). CRA también establece isolatedModules y allowJs en verdadero. Parece que no ha sido un problema hasta una versión más reciente de mecanografiado (no vi errores sobre setupProxy.js mientras estaba en mecanografiado 3.1.x, solo después de actualizar a 3.2.xo 3.3.x).

La solución alternativa de agregar archivos .js a su conjunto de exclusiones funciona cuando se ejecuta tsc, pero, de manera molesta, sigue viendo errores de esos archivos en los editores del servicio de idioma TS (probé VS Code y Webstorm). (Esto parece ser un problema separado y más general con el servicio de lenguaje TS que no respeta las exclusiones, pero no pude encontrar un problema existente para eso). Para enmascarar este error en los editores, agregué archivos .d.ts para los archivos * .js.

Además, requerir o importar los archivos .js hace que la exclusión también sea ineficaz, lo que provoca que se genere el error (fuera de su editor).

Solo deshabilitar allowJs (contra lo que sugiere create-react-app) parece funcionar para mí.

Sigo recibiendo este error para mi trabajador web.

He intentado excluir el archivo o carpeta individual y no me funciona.

¿No hay forma de anular esta configuración de módulos aislados, CRA sigue reescribiendo el tsconfig.json.

¿Cualquier otra sugerencia?

@jamespfarrell Pon export {}; en algún lugar de tu archivo.

@Macil gracias por tu consejo.

Me sale este error:

Error de intento de importación: './workers/HeartBeat.worker.js' no contiene una exportación predeterminada (importada como 'HeartBeatWorker').

Si agrego:

export default {};

Yo obtengo:

Error de tipo no detectado: _workers_HeartBeat_worker_js__WEBPACK_IMPORTED_MODULE_2 __. El valor predeterminado no es un constructor

¿No hay simplemente una manera de omitir estos 'módulos aislados' si no es para un archivo, incluso para todos los archivos?

Esos errores que está recibiendo ahora no están relacionados con la configuración de isolatedModules. Si desactivó isolatedModules, seguirá recibiendo esos errores.

Error de intento de importación: './workers/HeartBeat.worker.js' no contiene una exportación predeterminada (importada como 'HeartBeatWorker').

¿Dónde ocurre este error? Parece que estás intentando importar la exportación predeterminada de un archivo que no tiene uno, como import Foo from './workers/HeartBeat.worker.js'; . Si no desea importar una exportación predeterminada, cambie su línea de importación a import './workers/HeartBeat.worker.js'; .

¡Tienes razón, fue otra cosa @Macil ! ¡Gracias!

_Puede que alguien más tenga el mismo problema: _ Tuve el mismo error que apareció para algunos archivos que dejé como marcadores de posición sin contenido, pero los he estado importando en otros archivos, es decir. Tenía un archivo styles.js vacío que se importó en otro archivo de componente.

Solo agrega
image

Tuve este error para una definición de módulo que accidentalmente agregué como sufijo .ts lugar de .d.ts , si alguien más está cometiendo ese error en particular. Tengo que reiniciar el servidor después de la reparación.

Mismo error. Estoy usando CRA

Enfrenté este problema en CRA. Simplemente me olvidé de exportar cualquier cosa del archivo:
Снимок экрана от 2019-04-22 22-24-04

Entonces tuve este error porque tenía un archivo .js en la carpeta raíz de mi proyecto, en mi archivo tsconfig.json tenía esto configurado:

"compilerOptions": {
    ....
  },
  "include": ["src"],

Tuve que cambiarlo por esto:

"compilerOptions": {
    ....
  },
  "include": ["src/*"],

Eso lo solucionó, pero no entiendo por qué, ¿alguien puede explicármelo? Tenía entendido que incluir src eliminaría los archivos raíz y las carpetas hermanas.

@thitemple ¿

@ vort3xxx No lo hice. Vi esta publicación https://github.com/microsoft/TypeScript/issues/15230#issuecomment -479730947 de @DaviSpindola y lo probé. Eso fue todo

@ vort3xxx No lo hice. Vi esta publicación # 15230 (comentario) de @DaviSpindola y lo probé. Eso fue todo

Mismo problema, misma solución. TS 3.5.2.

@ThomasdenH

@simonbuchan Probé un .d.ts pero tampoco funcionó para mí, informaré por qué exactamente, no estoy seguro de qué fue. Y de hecho, CRA reescribió ese escenario para mí.

Encontrando exactamente el mismo problema. ¿Alguna vez averiguaste cómo resolver esto? La definición de .ts o .d.ts archivos de declaración dentro de una aplicación create react devuelve el error All files must be modules when the '--isolatedModules se proporciona la bandera. Establecer la bandera en false o eliminar la propiedad isolatedModules restablece por completo en true al iniciar la aplicación create react.
Agregar export {} al final del archivo de declaración da como resultado el error: Invalid module name in augmentation. Module '...' resolves to an untyped module at '...' .

Alguien por favor ayude. ¿Cómo agrego archivos de declaración personalizados a un proyecto de aplicación Create React?

Lo descubrí si alguien más tiene el mismo problema. Simplemente agregue sus tipos de declaración al archivo react-app-env.d.ts en la carpeta de origen cuando use la aplicación create react.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

bgrieder picture bgrieder  ·  3Comentarios

uber5001 picture uber5001  ·  3Comentarios

dlaberge picture dlaberge  ·  3Comentarios

kyasbal-1994 picture kyasbal-1994  ·  3Comentarios

CyrusNajmabadi picture CyrusNajmabadi  ·  3Comentarios