首页 > 解决方案 > 导出的变量不能用符号命名错误

问题描述

有两个模块如下给出相关错误(在编辑中简化):

// 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相关,这是声明生成器中的一个错误。不过,某种确认会很有用。

标签: typescript

解决方案


实际上,您指出的问题已经解释了这一点:

模块中的声明由两个符号表示,一个本地符号和一个导出符号。

p在 b.ts 中指向 sy 的本地符号。

ts 编译器有一个错误的地方是 b 现在sy在 b.ts 中查找本地符号:

它通过别名遍历 b.ts 的导出以查找符号,但最终得到的声明不等于本地符号。

这一轮使编译器认为符号不可见,而实际上它是可见的(因为 localSymbol/exportSymbol 关系)。


推荐阅读