Por que não funciona
import * as MC from './MyClass';
Esta é a import
sintaxe do estilo ES6 / ES2015 . O significado exato disso é "Pegue o objeto de namespace do módulo carregado de ./MyClass
e use-o localmente como MC
". Notavelmente, o " objeto de namespace do módulo " consiste apenas em um objeto simples com propriedades. Um objeto de módulo ES6 não pode ser chamado como uma função ou comnew
.
Repetindo : um objeto de namespace do módulo ES6 não pode ser invocado como uma função ou comnew
.
A coisa que você está import
usando* as X
em um módulo é definido para ter apenas propriedades. Em CommonJS de nível inferior, isso pode não ser totalmente respeitado, mas o TypeScript está dizendo a você qual é o comportamento definido pelo padrão.
O que funciona?
Você precisará usar a sintaxe de importação do estilo CommonJS para usar este módulo:
import MC = require('./MyClass');
Se você controlar os dois módulos, você pode usar export default
:
MyClass.ts
export default class MyClass {
constructor() {
}
}
MyConsumer.ts
import MC from './MyClass';
Estou triste com isso; As regras são mudas.
Teria sido bom usar a sintaxe de importação ES6, mas agora eu tenho que fazer isso import MC = require('./MyClass');
? É tão 2013! Lame! Mas o luto é uma parte normal da programação. Por favor, pule para o estágio cinco no modelo Kübler-Ross: Aceitação.
O TypeScript aqui está dizendo que isso não funciona, porque não funciona. Existem hacks (adicionar uma namespace
declaração a MyClass
é uma forma popular de fingir que isso funciona) e eles podem funcionar hoje em seu bundler de módulo de downlevel específico (por exemplo, rollup), mas isso é ilusório. Ainda não existem implementações de módulo ES6 disponíveis, mas isso não será verdade para sempre.
Imagine seu futuro, tentando executar em uma implementação de módulo ES6 neato nativo e descobrindo que você se preparou para uma falha grave ao tentar usar a sintaxe ES6 para fazer algo que o ES6 explicitamente não faz .
Quero aproveitar as vantagens do meu carregador de módulo não padrão
Talvez você tenha um carregador de módulo que "utilmente" cria default
exportações quando não existem. Quer dizer, as pessoas fazem padrões por uma razão, mas ignorar padrões é divertido às vezes e podemos achar que é uma coisa legal de se fazer.
Altere MyConsumer.ts para:
import A from './a';
E especifique a allowSyntheticDefaultImports
linha de comando ou tsconfig.json
opção.
Observe que allowSyntheticDefaultImports
não muda o comportamento do tempo de execução do seu código. É apenas um sinalizador que informa ao TypeScript que o carregador de módulo cria default
exportações quando não existem. Ele não fará seu código funcionar magicamente em nodejs quando não funcionava antes.
javascript
como uma tag primária e sairecmascript-6
, porque a tag primária aqui étypescript
. A questão assume erroneamente queexport =
(um recurso TS) pode ser emparelhado comimport ... from
, embora deva ser emparelhado comimport =
. É basicamente importação / exportação de módulo ES6 vs CJS / AMD.