Экспорт Typescript и экспорт по умолчанию
в чем разница в Typescript между export
и default export
. Во всех учебниках я вижу людей export
ing их классы, и я не могу скомпилировать свой код, если я не добавлю 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.
3 ответов
Экспорт По Умолчанию (export default
)
// MyClass.ts -- using default export
export default class MyClass { /* ... */ }
основное отличие заключается в том, что вы можете иметь только один экспорт по умолчанию для каждого файла, и вы импортируете его так:
import MyClass from "./MyClass";
вы можете дать ему любое имя. Например, это отлично работает:
import MyClassAlias from "./MyClass";
Названы Экспорт (export
)
// MyClass.ts -- using named exports
export class MyClass { /* ... */ }
export class MyOtherClass { /* ... */ }
когда вы используете именованный экспорт, вы можете иметь несколько экспорта на файл, и вам нужно импортировать экспорт, окруженный брекеты:
import { MyClass } from "./MyClass";
Примечание: добавление фигурных скобок исправит ошибку, которую вы описываете в своем вопросе, и имя, указанное в фигурных скобках, должно соответствовать имени экспорта.
или скажите, что ваш файл экспортирован несколько классы, то вы можете импортировать оба так:
import { MyClass, MyOtherClass } from "./MyClass";
// use MyClass and MyOtherClass
или вы можете дать любому из них другое имя в этом файле:
import { MyClass, MyOtherClass as MyOtherClassAlias } from "./MyClass";
// use MyClass and MyOtherClassAlias
или вы можете импортировать все, что экспортируется используя * as
:
import * as MyClasses from "./MyClass";
// use MyClasses.MyClass and MyClasses.MyOtherClass here
что использовать?
в ES6 экспорт по умолчанию является кратким, потому что их вариант использования более распространен; однако, когда я работаю над внутренним кодом проекта в TypeScript, я предпочитаю использовать именованный экспорт вместо экспорта по умолчанию почти все время, потому что он очень хорошо работает с рефакторингом кода. Например, если по умолчанию экспортировать класс и переименовать его, он будет переименовывать только класс в этом файле и никаких других ссылок в других файлах. С именованным экспортом он переименует класс и все ссылки на этот класс во всех других файлах.
он также играет очень хорошо с файлы баррель (файлы, использующие экспорт пространства имен -export *
-для экспорта других файлов). Пример этого показан в разделе "пример"ответ.
обратите внимание, что мое мнение об использовании именованного экспорта, даже если есть только один экспорт вопреки Руководство По Машинописи-см. раздел "красные флаги". Я считаю, что эта рекомендация применяется только при создании API для других людей, и код не является внутренним для вашего проекта. Когда я разрабатываю API для людей, я буду использовать экспорт по умолчанию, чтобы люди могли делать import myLibraryDefaultExport from "my-library-name";
. Если вы не согласны со мной в этом, я хотел бы услышать ваши доводы.
что сказал, найти то, что вы предпочитаете! Вы могли бы использовать один, другой, или оба в в то же время.
Дополнительные Пункты
экспорт по умолчанию на самом деле именованный экспорт с именем default
, поэтому, если файл имеет экспорт по умолчанию, вы также можете импортировать, выполнив:
import { default as MyClass } from "./MyClass";
и обратите внимание на эти другие способы импортировать существует:
import MyDefaultExportedClass, { Class1, Class2 } from "./SomeFile";
import MyDefaultExportedClass, * as Classes from "./SomeFile";
import "./SomeFile"; // runs SomeFile.js without importing any exports
вот пример с простым экспортом объектов.
var MyScreen = {
/* ... */
width : function (percent){
return window.innerWidth / 100 * percent
}
height : function (percent){
return window.innerHeight / 100 * percent
}
};
export default MyScreen
в главном файле (используйте, когда вам не нужно и не нужно создавать новый экземпляр), и это не глобально, вы импортируете это только тогда, когда это необходимо :
import MyScreen from "./module/screen";
console.log( MyScreen.width(100) );
Я пытался решить ту же проблему, но нашел интересный совет от Basarat Али Сайед, of TypeScript Глубокое Погружение известность, что мы должны избегать общего export default
объявление для класса и вместо этого добавьте export
тег к объявлению класса. Вместо этого импортированный класс должен быть указан в модуля.
то есть: вместо
class Foo {
// ...
}
export default Foo;
и просто import Foo from './foo';
в модуле, который будет импорт, следует использовать
export class Foo {
// ...
}
и import {Foo} from './foo'
в импортера.
причина этого-трудности с рефакторингом классов и дополнительная работа для экспорта. Оригинальный пост Basarat находится в export default
может привести к проблемам