gpt4 book ai didi

javascript - Typescript 生成带有 `#private;` 字段的声明 d.ts 文件

转载 作者:行者123 更新时间:2023-12-03 20:47:34 24 4
gpt4 key购买 nike

我有一个用 Typescript 编写的库,分布在 2 个文件中:编译后的 ECMAScript-2015 兼容 Javascript 文件 index.js和一个 Typescript 声明文件 index.d.ts .我的目标是让 Javascript 和 Typescript 开发人员都可以访问库(以便他们有正确的类型和自动完成)。
最近我升级到 Typescript 3.9.7,并决定重构我的代码以使用新的私有(private)类字段声明,该声明利用 #印记而不是 Typescript 的 private关键词。
令我惊讶的是,我的 index.d.ts由于包含 #private;,文件变得与旧的 Typescript 版本不兼容我类的成员。
这是生成旧声明文件的旧 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();
}
使用 # 的新重构代码用于声明私有(private)名称的符号:
// 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 文件)并依赖 index.d.ts类型,他们会看到以下错误:
error TS1127: Invalid character.
该错误的来源很清楚( # 印记),所以我的问题如下:
  • 如果我后处理我的 index.d.ts 可以吗?并删除 #private;在我将我的库发送给客户之前,不必了解实现细节?我可以使用 ttsc 轻松做到这一点包,但我仍然担心输入信息可能很重要。
  • #private;的实际用途是什么输入 index.d.ts ?为什么声明文件会暴露一个类使用私有(private)字段,如果它们无论如何都不能被访问,并且是实现细节?
  • 根据a topic in Typescript Github issues ,这是预期的行为,以便具有私有(private)字段的类在发送到 .d.ts 时保留其名义类型的行为。文件。可悲的是,这种解释的意义从我身上消失了。是否有任何额外的文档可以阅读以更好地理解 Typescript 的名义打字行为?
  • 最佳答案

    它使类型“名义上的”,以便公开相同公共(public)成员的其他类型不被视为与具有私有(private)字段的类型兼容。这很重要的一种情况是,如果您有这样的代码:

    class C {
    #foo = "hello";
    bar = 123;

    static log(instance: C) {
    console.log("foo = ", instance.#foo, " bar = ", instance.bar);
    }
    }
    我敢肯定还有更多示例,但这种静态方法只是我想到的一种方法。
    C.log 函数需要 C 类的实际实例,因为它访问 instance 参数上的私有(private)命名实例字段。如果声明 emit 没有反射(reflect) C 类型是名义上的,表明它有一个 ES 私有(private)字段,而是只发出公共(public)字段,编译器将在此处使用结构类型比较并且不会产生预期的类型错误。例如,该声明发出将允许相关代码将 { bar: 456 } 传递给 C.log,而不会出现任何编译器错误。

    关于javascript - Typescript 生成带有 `#private;` 字段的声明 d.ts 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64823219/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com