В чем разница между Typescript export
и default export
. Во всех уроках я вижу людей, использующих export
их классы, и я не могу скомпилировать свой код, если не добавлю default
ключевое слово перед экспортом.
Кроме того, я не смог найти никаких следов ключевого слова экспорта по умолчанию в официальной машинописной документации .
export class MyClass {
collection = [1,2,3];
}
Не компилируется. Но:
export default class MyClass {
collection = [1,2,3];
}
Имеет ли.
Ошибка: error TS1192: Module '"src/app/MyClass"' has no default export.
typescript
ecmascript-6
fos.alex
источник
источник
Ответы:
Экспорт по умолчанию (
export default
)Основное отличие состоит в том, что вы можете иметь только один экспорт по умолчанию на файл и импортировать его следующим образом:
Вы можете дать ему любое имя. Например, это работает нормально:
Именованный экспорт (
export
)Когда вы используете именованный экспорт, вы можете иметь несколько экспортов на файл, и вам нужно импортировать экспорт, заключенный в фигурные скобки:
Примечание. Добавление фигурных скобок исправит ошибку, которую вы описываете в своем вопросе, а имя, указанное в фигурных скобках, должно совпадать с именем экспорта.
Или, скажем, ваш файл экспортировал несколько классов, тогда вы можете импортировать оба так:
Или вы можете дать любому из них другое имя в этом файле:
Или вы можете импортировать все, что экспортируется, используя
* as
:Какой использовать?
В ES6 экспорт по умолчанию сжат, потому что его вариант использования более распространен ; однако, когда я работаю над кодом, внутренним для проекта в TypeScript, я предпочитаю использовать именованные экспорты вместо экспортов по умолчанию почти все время, потому что это очень хорошо работает с рефакторингом кода. Например, если вы экспортируете класс по умолчанию и переименовываете этот класс, он будет переименовывать только класс в этом файле, а не любые другие ссылки в других файлах. С именованным экспортом он переименует класс и все ссылки на этот класс во всех других файлах.
Он также очень хорошо воспроизводится с бочковыми файлами (файлами, использующими
export *
экспорт пространства имен - для экспорта других файлов). Пример этого показан в разделе «пример» этого ответа .Обратите внимание, что мое мнение об использовании именованных экспортов, даже если есть только один экспорт, противоречит Руководству по TypeScript - см. Раздел «Красные флаги». Я считаю, что эта рекомендация применима только тогда, когда вы создаете API для использования другими людьми, а код не является внутренним для вашего проекта. Когда я разрабатываю API для использования людьми, я использую экспорт по умолчанию, чтобы люди могли это делать
import myLibraryDefaultExport from "my-library-name";
. Если вы не согласны со мной по поводу этого, я хотел бы услышать ваше мнение.Тем не менее, найти то, что вы предпочитаете! Вы можете использовать один, другой или оба одновременно.
Дополнительные очки
Экспорт по умолчанию на самом деле является именованным экспортом с именем
default
, поэтому, если файл имеет экспорт по умолчанию, вы также можете импортировать, выполнив:И обратите внимание на следующие способы импорта:
источник
import myAlias = require("./PathToFile")
и чтоexport = IInterfaceOrClass
в файле? Это старомодно сейчас?default
будет ли в этом файле доступен экспорт по умолчанию? если так, каковы правила.Я пытался решить ту же проблему, но нашел интересный совет Басарата Али Сайеда , известного в TypeScript Deep Dive , о том, что нам следует избегать универсального
export default
объявления для класса и вместо этого добавлятьexport
тег к объявлению класса. Импортированный класс должен быть указан вimport
команде модуля.То есть вместо
и простой
import Foo from './foo';
в модуле, который будет импортировать, следует использоватьи
import {Foo} from './foo'
в импорте.Причиной этого являются трудности в рефакторинге классов и добавленная работа на экспорт. Оригинальный пост Басарата в
export default
может привести к проблемамисточник
Вот пример с простым экспортом объектов.
В основном файле (используйте, когда вы не хотите и не нужно создавать новый экземпляр), и он не является глобальным, вы импортируете его только тогда, когда это необходимо:
источник