typescript - 导出的变量不能用符号命名错误
问题描述
有两个模块如下给出相关错误(在编辑中简化):
// b.ts
export const sy = Symbol();
export const p = { [sy]: 0 };
// index.ts
import { sy, p } from './b';
export const a: { [sy]: number } = p; // works
export const b = p; // error
导出的变量“b”已经或正在使用来自外部模块“c:/my/cool/path/b”的名称“sy”,但不能命名.ts(4023)
(declaration
启用)
请注意,当推断的类型显式复制到注释中时,错误就会消失。更改为 时export const sy = 'someString';
,它也可以正常工作(仅限于符号)。更奇怪的是,将符号导出转换为:
const sy = Symbol();
export { sy };
(将导出拆分为自己的行)
我根本无法理解,问题到底出在哪里,最后一部分让我更加困惑,因为两种表示应该是等价的,但不是。
这是一个错误吗?我可以切换到非符号,但除了语义差异之外,这意味着放弃并接受“符号不起作用”,这并不是很好。
我目前假设它与https://github.com/microsoft/TypeScript/issues/40718#issuecomment-738295483相关,这是声明生成器中的一个错误。不过,某种确认会很有用。
解决方案
实际上,您指出的问题已经解释了这一点:
模块中的声明由两个符号表示,一个本地符号和一个导出符号。
p
在 b.ts 中指向 sy 的本地符号。
ts 编译器有一个错误的地方是 b 现在sy
在 b.ts 中查找本地符号:
它通过别名遍历 b.ts 的导出以查找符号,但最终得到的声明不等于本地符号。
这一轮使编译器认为符号不可见,而实际上它是可见的(因为 localSymbol/exportSymbol 关系)。
推荐阅读
- gitlab - 有没有办法在 yaml 文件中指定 CICD Pipeline 目标路径?
- android - 启动 Surface Duo 模拟器显示“ACPI”错误并且模拟器无法启动
- python - 将前面的 X 行变成额外的列 [Pandas]
- javascript - wkwebview:查看网页视图中加载的内容是否为 PDF 并给出下载按钮
- java - 如何使用 Pkcs12 密钥库证书使用 WSDL Web 服务
- javascript - 如何连接动态生成的数组
- azure - 使用 CI 将 webapp 从 git 部署到 Azure
- python - 熊猫 to_timedelta 不连贯值返回
- java - 如何使用`onSaveInstanceState`?
- r - 是否可以在 Rmarkdown 的背面复制乳胶语法?