Por que no funciona
import * as MC from './MyClass';
Esta es la import
sintaxis de estilo ES6 / ES2015 . El significado exacto de esto es "Tomar el objeto del espacio de nombres del módulo cargado ./MyClass
y usarlo localmente como MC
". En particular, el " objeto de espacio de nombres de módulo " consta solo de un objeto simple con propiedades. Un objeto de módulo ES6 no se puede invocar como función o con new
.
Para decirlo de nuevo: un objeto de espacio de nombres de módulo ES6 no se puede invocar como una función o con new
.
Lo que import
usa * as X
de un módulo está definido para que solo tenga propiedades. En CommonJS rebajado, esto podría no respetarse por completo, pero TypeScript le dice cuál es el comportamiento definido por el estándar.
¿Qué funciona?
Necesitará usar la sintaxis de importación estilo CommonJS para usar este módulo:
import MC = require('./MyClass');
Si controlas ambos módulos, puedes usar export default
en su lugar:
MyClass.ts
export default class MyClass {
constructor() {
}
}
MyConsumer.ts
import MC from './MyClass';
Estoy triste por esto; Las reglas son tontas.
Hubiera sido bueno usar la sintaxis de importación de ES6, pero ahora tengo que hacer esto import MC = require('./MyClass');
. ¡Es tan 2013! ¡Cojo! Pero el dolor es una parte normal de la programación. Salte a la etapa cinco en el modelo Kübler-Ross: Aceptación.
TypeScript aquí le dice que esto no funciona, porque no funciona. Hay hacks (agregar una namespace
declaración a MyClass
es una forma popular de pretender que esto funciona), y podrían funcionar hoy en su paquete de módulos de bajada de nivel particular (por ejemplo, rollup), pero esto es ilusorio. Todavía no hay implementaciones del módulo ES6 en la naturaleza, pero eso no será cierto para siempre.
Imagínese usted mismo en el futuro, tratando de ejecutar una implementación nativa del módulo ES6 y descubriendo que se ha preparado para una falla importante al intentar usar la sintaxis de ES6 para hacer algo que ES6 explícitamente no hace .
Quiero aprovechar mi cargador de módulos no estándar
Tal vez tenga un cargador de módulos que "provechosamente" crea default
exportaciones cuando no existen. Quiero decir, la gente crea estándares por una razón, pero ignorarlos a veces es divertido y podemos pensar que es algo genial.
Cambie MyConsumer.ts por:
import A from './a';
Y especifique la allowSyntheticDefaultImports
línea de comandos u tsconfig.json
opción.
Tenga en cuenta que allowSyntheticDefaultImports
no cambia el comportamiento en tiempo de ejecución de su código en absoluto. Es solo una bandera que le dice a TypeScript que su cargador de módulos crea default
exportaciones cuando no existen. No hará que su código funcione mágicamente en nodejs cuando antes no lo hacía.
javascript
como etiqueta principal y salirecmascript-6
, porque la etiqueta principal aquí estypescript
. La pregunta asume erróneamente queexport =
(una función de TS) se puede emparejar conimport ... from
, mientras que debería emparejarse conimport =
. Es básicamente la importación / exportación del módulo ES6 frente a CJS / AMD.