在 TypeScript 编译过程中,可能会遇到如下的报错:
Exported variable <variable name> has or is using private name <private name>
这一报错只会出现在开启了 declaration 输出之后。开启的方式是编译时增加 --declaration
,或者在 tsconfig.json 中加入:
{
"compilerOptions": {
"declaration": true
}
}
出现这一报错的原因是,最终被使用的某一个类型,引用到了某一个没有被公开(export)的类型。简单的例子如下:
interface A {
// ...
}
interface B {
// ...
}
export declare type Props = A | B;
这里,之所以会出现问题,理由很简单:TypeScript 试图输出一个定义类型的文件,其中就包括了 Props
的定义。然而,如果要明确定义 Props
,就需要用到两个类型 A
和 B
。在这里,A
和 B
这两个类型因为没有被公开(export),因而是私有(private)的。故,理论上来说,TypeScript 的导出定义文件中不应该包含这两个类型。而没有这两个类型的话,TypeScript 就没有办法定义 Props
了。最终,TypeScript 只能报错。
官方给出的解释可以参考这里。
要解决这个问题,方法也很简单:所有使用到的类型,全部都公开(export)就好了。