当前位置: 首页 > 知识库问答 >
问题:

Typescript导出与默认导出

令狐泓
2023-03-14
export class MyClass {

  collection = [1,2,3];

}
export default class MyClass {

  collection = [1,2,3];

}

做。

错误是:错误TS1192:模块“src/app/myclass”没有默认导出。

共有1个答案

夏建木
2023-03-14

默认导出(导出默认值)

// MyClass.ts -- using default export
export default class MyClass { /* ... */ }

主要区别在于,每个文件只能有一个默认导出,并且您可以像这样导入它:

import MyClass from "./MyClass";

你可以给它取任何你喜欢的名字。例如,这很好:

import MyClassAlias from "./MyClass";
// 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
import * as MyClasses from "./MyClass";
// use MyClasses.MyClass and MyClasses.MyOtherClass here

用哪一个?

在ES6中,默认导出很简洁,因为它们的用例更常见;但是,当我在TypeScript中处理项目内部的代码时,我更喜欢几乎一直使用命名导出而不是默认导出,因为它非常适合代码重构。例如,如果默认导出类并重命名该类,则它将只重命名该文件中的类,而不重命名其他文件中的任何其他引用。使用命名导出,它将重命名该类以及所有其他文件中对该类的所有引用。

它还能很好地处理barrel文件(使用命名空间导出-export*-导出其他文件的文件)。这方面的一个例子在本答案的“示例”部分中显示。

请注意,即使只有一个导出,我对使用命名导出的看法也与TypeScript手册相反--请参见“红旗”一节。我相信这个建议只适用于当您正在创建一个供其他人使用的API,并且代码不是您的项目内部的时候。当我设计供人们使用的API时,我将使用默认导出,以便人们可以从“my-library-name”导入myLibraryDefaultExport;。如果你不同意我这样做,我很想听听你的理由。

也就是说,找到你喜欢的!您可以同时使用其中一个、另一个或两者。

附加要点

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
 类似资料:
  • 模块“Transformer”解析为非模块实体,不能使用此构造导入。 如何导入类?其实我只是想利用那堂课。我不希望指令在我的代码中产生附带效应。我只想用它:'(

  • 我有一个VUE2项目,我编写了一个简单的函数来翻译日期中的月份,我想将它导入到我的一个组件中,但是我得到了一个错误: 在“@/utils/date-translation”中找不到导出“default”(导入为“translate date”) src文件夹中的相对文件路径是正确的,我导出的函数如下所示: 然后我将其导入到组件中,如下所示: 我做错了什么?

  • 问题内容: 如果要创建组件,似乎可以用很多不同的方式创建类。这些有什么区别?我怎么知道要使用哪个? 我只是假设他们做不同的事情,还是只是语法不同? 如果有人可以给我快速的解释或链接,我将不胜感激。我不想从一个新的框架开始,不知道到底有什么区别。 问题答案: 嗨,欢迎来到React! 我认为您在这里遇到的问题并不是与React特定的,而是与新的ES2015模块语法有关。在创建React类组件时,出于

  • Node的 和ES6的 有什么区别?我试图弄清楚为什么在Node.js6.2.2中尝试 时会出现“__is not a constructor”错误。

  • 问题内容: 档案:SafeString.js 我从未见过。是否有任何等效的东西更容易理解? 问题答案: 它是ES6模块系统的一部分,该文档中还有一个有用的示例: 如果模块定义了默认导出: 那么您可以通过省略花括号来导入默认导出: 更新: 自2015年6月,该模块系统中定义§15.2和在特定语法中定义§15.2.3ECMAScript的2015规范的。

  • 文件:safeString.js 我以前从未见过。对于,是否有更容易理解的等效内容?