我有一个用 Typescript 编写的库,它分布在 2 个文件中:一个已编译的 ECMAScript-2015 兼容 Javascript 文件index.js
和一个 Typescript 声明文件index.d.ts
。我的目标是让 Javascript 和 Typescript 开发人员都可以访问库(以便他们拥有正确的类型和自动完成功能)。
最近我升级到了 Typescript 3.9.7,并决定重构我的代码以使用新的私有类字段声明,该声明利用#
印记而不是 Typescript 的private
关键词。
令我惊讶的是,我的index.d.ts
由于包含以下内容,文件与旧的 Typescript 版本不兼容#private;
我的班级成员。
以下是生成旧声明文件的旧 Typescript 代码与生成新的不兼容声明文件的新重构 Typescript 代码之间的比较。旧代码利用private
关键词:
// index.ts
class MyClass {
private field1: string = "foo";
private field2: string = "bar";
constructor() {
console.log(this.field1, this.field2);
}
}
// generated index.d.ts
declare class MyClass {
private field1;
private field2;
constructor();
}
新的重构代码使用#
声明私有名称的印记:
// index.ts
class MyClass {
#field1: string = "foo";
#field2: string = "bar";
constructor() {
console.log(this.#field1, this.#field2);
}
}
// generated index.d.ts
declare class MyClass {
#private;
constructor();
}
Here is Typescript 游乐场的一个页面 https://www.typescriptlang.org/play?ts=3.9.7#code/MYGwhgzhAECyCeBhcVoG8BQ1vQMQDMBLAUxABMBGALmggBcAnQgOwHNoBeaAInwHs+3ANxYcBEuQBMNekzaceAIzANhGUdmB9msgK7A6fBgAoAlOg05N2iHxDEAdCD6tjdABaEID8aUoAaaA8vHyI-SVMRKwBfDGigA包含该示例代码。
现在,如果我的客户使用旧的 Typescript(比方说,版本 3.7)将获取我的库(由编译的index.js
和声明文件index.d.ts
,没有来源index.ts
文件)并依赖index.d.ts
类型,他们会看到以下错误:
error TS1127: Invalid character.
该错误的根源很明确(#
印记),所以我的问题如下:
- 如果我对我的进行后处理可以吗?
index.d.ts
并删除#private;
在我将库交付给客户之前,无需了解实施细节?我可以通过使用轻松做到这一点ttsc
包,但我仍然担心输入信息可能在某种程度上很重要。
- 有什么实际用途
#private;
线路输入index.d.ts
?如果声明文件无论如何都无法访问它们并且是实现细节,那么为什么声明文件会公开类使用私有字段?
- 根据Typescript Github 问题中的一个主题 https://github.com/microsoft/TypeScript/issues/38050,这是预期的行为,以便具有私有字段的类在发送到
.d.ts
文件。可悲的是,这个解释的意义已经离我而去。我可以阅读任何额外的文档来更好地理解 Typescript 的名义输入行为吗?