Anteriormente podía hacer:
import foo = require('foo');Pero ahora que TypeScript (1.5) admite la sintaxis del módulo es6, ¿cuál es la forma correcta de lograr lo mismo en la sintaxis del módulo ES6?
La forma correcta es continuar usando la sintaxis de importación anterior. La nueva sintaxis de importación es solo para módulos ES, la antigua sintaxis de importación es para módulos anteriores a ES6. Los dos son distintos, intencionalmente. import * as foo from 'foo' importa todas las propiedades del módulo 'foo', no importa el valor predeterminado como foo .
export default siempre tiene la semántica del módulo ES. Por compatibilidad con Babel, podríamos emitir opcionalmente un marcador __esModule cuando un módulo tiene una exportación predeterminada, pero en realidad no usaríamos ese marcador para nada.export = , que sustituye una entidad diferente para ser exportada en lugar del propio módulo, siempre se emite como una asignación a module.exports . Es un error tener otras exportaciones en un módulo que usa export = . Este es el comportamiento existente de TypeScript.export = para exportar otro módulo (ya sea un módulo interno o externo) se puede importar usando las nuevas construcciones de ES6. En particular, las importaciones de desestructuración convenientes se pueden usar con dichos módulos. El patrón de usar export = para exportar otro módulo es común en archivos .d.ts que proporcionan una vista CommonJS/AMD de un módulo interno (por ejemplo, angular.d.ts).export = para exportar una entidad que no es un módulo en lugar del propio módulo debe importarse usando la sintaxis import x = require("foo") existente, como es el caso actualmente. Actualización de 2016: el compilador de TypeScript en algún momento comenzó a permitir import * as foo from 'legacy-module-foo' para obtener la importación predeterminada de un módulo heredado en ciertas circunstancias. Esto es una violación de la especificación ES6 ( §15.2.1.16 , "El valor "*" indica que la solicitud de importación es para el objeto de espacio de nombres del módulo de destino" .).
Cuando los módulos heredados que importa de esta manera se actualizan a módulos ES6, las importaciones "predeterminadas" para esos módulos dejarán de funcionar (porque * como se supone que las importaciones * as foo están importando objetos de espacio de nombres), lo que puede ser extremadamente confuso si no lo hace sepa que hacer esto es un truco de TypeScript/SystemJS. También es posible que una futura realineación de TypeScript a la especificación ES haga que se rompan.
Como tal, probablemente debería preferir continuar usando la sintaxis de importación heredada descrita anteriormente para cargar módulos heredados para evitar confundirse a sí mismo y a otros desarrolladores que trabajan en su código acerca de cómo funcionan las importaciones de espacios de nombres ES6, y para evitar confundir los cambios de última hora.
La sintaxis correspondiente para la sintaxis del módulo ES6 es:
import * as foo from 'foo'; Básicamente importa todo, desde el módulo foo a una variable local con el nombre foo .
A partir de TypeScript 2.7 , hay una nueva esModuleInterop que se puede usar para habilitar las importaciones predeterminadas con CommonJS/AMD/UMD. Al establecer ese indicador en true en su tsconfig.json , esto debería funcionar como se esperaba:
import foo from 'foo';