【发布时间】:2021-02-18 18:15:43
【问题描述】:
我有一个用 Typescript 编写的库,它分布在 2 个文件中:一个编译后的 ECMAScript-2015 兼容 Javascript 文件 index.js 和一个 Typescript 声明文件 index.d.ts。我的目标是让 Javascript 和 Typescript 开发人员都可以访问库(以便他们有正确的类型和自动完成功能)。
最近我升级到 Typescript 3.9.7,并决定重构我的代码以使用新的私有类字段声明,该声明利用 # sigil 而不是 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();
}
使用# sigil 声明私有名称的新重构代码:
// 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();
}
这是包含该示例代码的a page at Typescript playground。
现在,如果我的客户使用旧的 Typescript(比如 3.7 版)将获取我的库(由编译后的 index.js 和声明文件 index.d.ts 组成,没有源文件 index.ts 文件)并依赖于 @ 987654336@ 类型,他们会看到以下错误:
error TS1127: Invalid character.
该错误的来源很清楚(# sigil),所以我的问题如下:
- 如果我在将库发送给不需要了解实施细节的客户之前对
index.d.ts进行后处理并删除#private;行,是否可以?我可以通过使用ttsc包轻松做到这一点,但我仍然担心输入信息可能很重要。 -
index.d.ts中的#private;行有什么实际用途?为什么声明文件会暴露一个类使用私有字段,如果它们无论如何都无法访问,并且是实现细节? - 根据a topic in Typescript Github issues,这是预期的行为,以便具有私有字段的类在发送到
.d.ts文件时保留其名义类型的行为。可悲的是,这种解释的意义从我身上消失了。是否有任何额外的文档可供我阅读以更好地理解 Typescript 的名义打字行为?
【问题讨论】:
标签: javascript typescript typescript-typings