Typescript 生成带有“#private;”字段的声明 d.ts 文件

2024-06-19

我有一个用 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.

该错误的根源很明确(#印记),所以我的问题如下:

  1. 如果我对我的进行后处理可以吗?index.d.ts并删除#private;在我将库交付给客户之前,无需了解实施细节?我可以通过使用轻松做到这一点ttsc包,但我仍然担心输入信息可能在某种程度上很重要。
  2. 有什么实际用途#private;线路输入index.d.ts?如果声明文件无论如何都无法访问它们并且是实现细节,那么为什么声明文件会公开类使用私有字段?
  3. 根据Typescript Github 问题中的一个主题 https://github.com/microsoft/TypeScript/issues/38050,这是预期的行为,以便具有私有字段的类在发送到.d.ts文件。可悲的是,这个解释的意义已经离我而去。我可以阅读任何额外的文档来更好地理解 Typescript 的名义输入行为吗?

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

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

    static log(instance: C) {
        console.log("foo = ", instance.#foo, " bar = ", instance.bar);
    }
}

我确信还有更多的例子,但这个静态方法只是我想到的一个。

This C.log函数需要一个实际的实例C类,因为它访问私有命名的实例字段instance范围。如果声明发出没有反映Ctype 是名义上的,表明它有一个 ES 私有字段,而不是仅发出公共字段,编译器将在此处使用结构类型比较,并且不会产生预期的类型错误。例如,该声明发出将允许依赖代码传入{ bar: 456 } to C.log没有任何编译器错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Typescript 生成带有“#private;”字段的声明 d.ts 文件 的相关文章

随机推荐

  • 检测 Java JAR/代码篡改

    我正在编写一个以 JAR 文件形式分发的软件 目前 该 JAR 文件可以被篡改以检索并保存我们的服务器通过以下方式传输的另一个文件URLClassLoader 进行反编译 并在我们的代码中找到应保持私有的各种内容 以确保使用它的客户端的安全
  • Django 检索 GET 列表

    我是 Django 新手 我有一个 URL 列表 例如 example com item test item for test url 我知道如何在视图中检索该值 a request GET getlist item 我的问题是 如何在模板
  • 使用 Flutter 3.10 / Dart 3.0 进行 VS Code 调试<优化>

    在最新的 颤振 升级 之后 我在 VS Code 调试期间查看某些变量时遇到问题 如何在悬停时查看变量的内容而不是获取此内容 Screenshot of hovering variable 这仅发生在某些变量上 其他变量我可以正常查看内容
  • tkinter:无法使框架可滚动

    在 python tkinter 上 我在顶级窗口上使用 2 个不同的框架 一个在右侧 另一个在左侧 右侧的框架不可滚动 我在该框架的框架顶部创建了一个画布 并在该画布顶部创建了另一个框架 我已使该画布可滚动并将小部件粘贴到该画布上 但它不
  • 在iPhone上将CSV文件读入sqlite3

    有没有办法在iPhone上将CSV文件读入sqlite3 sqlite3 是否有类似于 SQL 命令的功能 LOAD DATA LOCAL INFILE file csv INTO TABLE TABLENAME FIELDS TERMIN
  • 将列表数据放入地图时出现异常

    我正在迭代一个列表并将其内容放在地图上 但问题是 当我返回该地图时 我遇到了异常 您能否告知其背后的原因是什么 我收到了 java lang IndexOutOfBoundsException 索引 100 大小 100 因为我的列表大小是
  • 在 swift 3 的 textview 中显示属性文本?

    我想以斜体 粗体显示从服务器收到的文本 你好世界所以 responseObj text p b i hello i b i world gt i p if let postText String responseObj text as St
  • DOM TreeWalker 返回所有文本节点

    我试图访问给定元素内的所有文本节点 以便我可以隔离单词并将它们包装在跨度中 TreeWalker似乎是这项工作的 API 但我发现它非常不直观 既没有spec http www w3 org TR DOM Level 2 Traversal
  • 等待网页完全加载,然后再使用 python 请求进行抓取

    我目前正在尝试从 LinkedIn 上的特定页面抓取数据 我有一个能够登录 LinkedIn 的脚本 但当我尝试访问包含数据的页面时遇到了障碍 当我打电话时requests get data url 我最终得到了 LinkedIn 加载屏幕
  • 我在哪里可以学习游戏物理及其背后的数学基础知识? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我在大学学过数学 三角学 微积分 II 但我不知道为什么在游戏物理中使用 tan arctan 等 我
  • 实施令牌认证

    在我的网页中实施令牌身份验证必须遵循哪些步骤 任何摘要或链接将不胜感激 我想实现类似于 Facebook 或 Google 的功能 首次客户端登录并接收令牌 然后在下一步操作中使用它 我还阅读了有关 OAuth 的内容 但我不想让第三方访问
  • 获取 CSS 计算结果以设置自定义属性

    我正在测试一个 CSS 框架 用于通过微类指定数字 例如 类似的东西 div class fifty percent wide 可能会翻译成width 50 该实现使用 CSS 变量 自定义属性 考虑以下 CSS fifty number
  • 找到不固定长度的数字的所有可能排列以达到给定的总和或乘积

    使用普通 Python 或任何 Python 库 您将如何查找列表中元素的所有可能组合l等于给定值val using addition 减法 or 乘法 假设列表的长度并不总是相同 假设列表中的每个元素在每个组合中只能使用一次 并假设没有使
  • RSA 已处置对象错误 - 所有其他测试

    我们有几个测试生成 jwt 请求来调用服务器来检索令牌 我们有 6 个测试 使用相同的数据对相同的方法进行相同的调用 方法如下 private static string GenerateSignedTokenRequest string
  • 为什么我在 Windows 上使用 async 和 wait 时会收到 NotImplementedError 错误?

    我有这个代码 import os import time import asyncio async def run command args Example from http asyncio readthedocs io en lates
  • 如何使用 Nginx 将下划线替换为破折号

    我第一次使用Nginx 对它基本上一无所知 我需要将 100 多个 URL 中的 替换为 我想一定有一种简单的方法可以用 Nginx 来做到这一点 但在 Google 上找不到任何东西 Thanks Edit 我的网址例如 http www
  • 为什么我会遇到分段错误?

    我只想创建一个简单的 C 结构 它有一个 int 索引和一个 int greyValue 该函数被赋予带有灰度值的向量 当我尝试编译它时 出现分段错误 有人知道为什么吗 没有对向量进行排序 谢谢 vector
  • Xcode 6 仪器冻结

    在 Xcode 6 Instruments 中分析我的 iOS 8 应用程序将运行该应用程序约 5 秒 然后冻结 此后探查器仍将运行 但应用程序已冻结且无法使用 发生在设备和模拟器上 无论我使用哪个分析器 计时器 泄漏等 从调试器或临时构建
  • AngularJS 指令的完整列表?

    我正在学习 AngularJS 是否有所有开箱即用指令的完整列表 这FAQ http docs angularjs org misc faq提及ng repeat ng show and ng class 但我感觉还有更多 奇怪的是我找不到
  • Typescript 生成带有“#private;”字段的声明 d.ts 文件

    我有一个用 Typescript 编写的库 它分布在 2 个文件中 一个已编译的 ECMAScript 2015 兼容 Javascript 文件index js和一个 Typescript 声明文件index d ts 我的目标是让 Ja