是否打算使用export {}来关闭TypeScript模块声明中所有符号的自动导出?

时间:2018-10-01 01:36:39

标签: typescript

默认情况下,在TypeScript外部模块声明(整个.d.ts文件或另一个文件中的declare module块)中,即使未标记export,所有符号也会被导出。 。 Luke Pighetti discovered说,添加export { ... }语句可以抑制此行为,因此仅导出标记为export的符号。

示例my-module.d.ts

export const a = 1;
declare const b = 2;
export {};

consumer.ts

import { a } from "./my-module";  // OK
import { b } from "./my-module";  // Error

此行为可能有用。是故意的,还是我应该报告而不鼓励人们依赖的TypeScript错误?

2 个答案:

答案 0 :(得分:3)

andy-ms says该行为是故意的。 (但它是未记录的AFAIK,就像许多高级TypeScript行为一样。:()

我找到了涉及的the compiler code。关闭自动导出的结构的完整列表:

  • export { ... }
  • export { ... } from "module"
  • export * from "module"
  • export = ...
  • 表达式的export default,而不是函数,类或接口定义的export default

答案 1 :(得分:0)

这是故意的。

TypeScript文件可以是脚本文件或模块文件。 与to的区别在于,模块文件至少具有一个顶级导入/导出。

当文件是模块文件时,只有使用export关键字显式导出的代码才可用。

对于脚本文件,将其视为全局文件的一部分,这意味着您的内容将在其他文件中可用。

对于键入文件(*.d.ts),在DefinitelyTyped中将它们编写为脚本文件,格式为declare module x { ... },以定义特定模块的键入。

它是用DefinitelyTyped编写的,因为它是许多模块的存储库,工具需要知道为其定义的模块。

如果您为JavaScript库创建类型文件并随该库一起分发,它将作为模块文件写入。