Qual é a diferença em Typcript entre export
e default export
. Em todos os tutoriais, vejo pessoas em export
suas classes e não consigo compilar meu código se não adicionar a default
palavra - chave antes de exportar.
Além disso, não encontrei nenhum rastro da palavra-chave de exportação padrão na documentação oficial datilografada .
export class MyClass {
collection = [1,2,3];
}
Não compila. Mas:
export default class MyClass {
collection = [1,2,3];
}
Faz.
O erro é: error TS1192: Module '"src/app/MyClass"' has no default export.
typescript
ecmascript-6
fos.alex
fonte
fonte
Respostas:
Exportação padrão (
export default
)A principal diferença é que você pode ter apenas uma exportação padrão por arquivo e importá-la da seguinte maneira:
Você pode dar o nome que quiser. Por exemplo, isso funciona bem:
Exportação nomeada (
export
)Ao usar uma exportação nomeada, você pode ter várias exportações por arquivo e precisa importar as exportações entre chaves:
Nota: A adição de chaves corrigirá o erro que você está descrevendo na sua pergunta e o nome especificado nas chaves precisa corresponder ao nome da exportação.
Ou diga que seu arquivo exportou várias classes, então você pode importar as duas coisas assim:
Ou você pode dar a um deles um nome diferente neste arquivo:
Ou você pode importar tudo o que é exportado usando
* as
:Qual usar?
No ES6, as exportações padrão são concisas porque seu caso de uso é mais comum ; no entanto, quando estou trabalhando no código interno de um projeto no TypeScript, prefiro usar exportações nomeadas em vez de exportações padrão quase o tempo todo, porque funciona muito bem com a refatoração de código. Por exemplo, se você exportar uma classe por padrão e renomear essa classe, ela somente renomeará a classe nesse arquivo e não nenhuma das outras referências em outros arquivos. Com exportações nomeadas, ele renomeará a classe e todas as referências a essa classe em todos os outros arquivos.
Também funciona muito bem com arquivos barril (arquivos que usam exportações de namespace -
export *
para exportar outros arquivos). Um exemplo disso é mostrado na seção "exemplo" desta resposta .Observe que minha opinião sobre o uso de exportações nomeadas, mesmo quando há apenas uma exportação, é contrária ao Manual do TypeScript - consulte a seção "Bandeiras vermelhas". Acredito que esta recomendação se aplique apenas quando você estiver criando uma API para outras pessoas usarem e o código não for interno ao seu projeto. Ao projetar uma API para uso das pessoas, utilizarei uma exportação padrão para que as pessoas possam fazer
import myLibraryDefaultExport from "my-library-name";
. Se você não concorda comigo sobre isso, eu adoraria ouvir seu raciocínio.Dito isto, encontre o que você prefere! Você pode usar um, outro ou ambos ao mesmo tempo.
Pontos adicionais
Uma exportação padrão é na verdade uma exportação nomeada com o nome
default
; portanto, se o arquivo tiver uma exportação padrão, você também poderá importar fazendo:E observe que existem outras maneiras de importar:
fonte
import myAlias = require("./PathToFile")
e terexport = IInterfaceOrClass
no arquivo? Isso é antiquado agora?default
, ainda haverá uma exportação padrão disponível nesse arquivo? Se sim, quais são as regras.Eu estava tentando resolver o mesmo problema, mas encontrei um conselho interessante de Basarat Ali Syed , da fama TypeScript Deep Dive , de que deveríamos evitar a
export default
declaração genérica de uma classe e, em vez disso, anexar aexport
marca à declaração da classe. A classe importada deve ser listada noimport
comando do módulo.Ou seja: em vez de
e o simples
import Foo from './foo';
no módulo que importará, deve-se usare
import {Foo} from './foo'
no importador.O motivo disso são as dificuldades na refatoração de classes e o trabalho adicional para exportação. O post original de Basarat está em
export default
pode levar a problemasfonte
Aqui está um exemplo com a exportação simples de objetos.
No arquivo principal (use quando você não deseja e não precisa criar uma nova instância) e não é global, você importará isso apenas quando necessário:
fonte