TypeScript export default type

ru9i0ody  于 4个月前  发布在  TypeScript
关注(0)|答案(5)|浏览(57)

搜索词

export default type

建议

允许 export default 用于 type

用例

如果能将 export default type 与其他默认导出(如类和接口)匹配,那将会非常方便。
目前,将任何内容作为默认导出并仅允许具有命名导出的类型看起来非常不一致:

export default class MyClass {}
export default interface MyInterface {}
export type MyType = {}

现在实现这一点的唯一方法是使用令人讨厌的解决方法:

type X = number | string

export { X as default }

这可能会让新手感到困惑,因为没有明确的原因说明为什么类和接口可以作为默认导出,而不能是类型。

示例

// x.ts
export default type X = {}

// main.ts
import X from './x'

检查清单

我的建议满足以下准则:

  • 这不会对现有的 TypeScript/JavaScript 代码造成破坏性更改
  • 这不会改变现有 JavaScript 代码的运行时行为
  • 这可以在不根据表达式的类型发出不同的 JS 的情况下实现
  • 这不是一个运行时特性(例如库功能、带有 JavaScript 输出的非 ECMAScript 语法等)
  • 这个特性将与 TypeScript's Design Goals 的其他部分保持一致。
  • (不确定最后一个)*
qlvxas9a

qlvxas9a1#

我经常想要导出既是类型又是值的属性。例如:

export const Tag = Symbol.for("@my-app/entry.Tag");
export type Tag = typeof Tag;

对我来说,这应该也可以用默认导出实现。

im9ewurl

im9ewurl2#

Any updates on this?

tyky79it

tyky79it3#

TypeScript 5.0(在 #52203 中引入了一个名为 --verbatimModuleSyntax 的新选项,使得以下代码产生以下错误:An 'export default' must reference a value when 'verbatimModuleSyntax' is enabled, but 'X' only refers to a type.,因为默认导出 X 没有明确标记为类型:

type X = number | string;
export default X;

解决方法是在 export 声明中使用命名导出将 X 标记为类型:

type X = number | string;
export type {X as default}; // or export {type X as default};

但这看起来相当间接。拥有 export default type X; 也有助于使这变得更加直接。

hgc7kmma

hgc7kmma4#

看起来像是个bug,因为我在一个文件里只有1种类型。

tkclm6bt

tkclm6bt5#

对于那些正在寻找"export default的类型注解"的人,请跟随#13626

相关问题