如何使 4.X Typescript 项目与旧版本的 Typescript(如 3.X)兼容?

2024-05-30

如何使基于 TS 4.X 构建的软件包与 3.X 兼容?例如,如果我有较新的版本,则使用新功能,否则使用any or unknown或旧版本支持的任何内容。

有没有可能使用指令 https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html为了这个目的?


Preface

This answer assumes the question is about taking source code (.ts) of a project written using TypeScript 4.x constructs and making type declaration files (.d.ts) emitted from them compatible with a TypeScript 3.x compiler for the benefit of the users of the package- as opposed to writing source code that uses 4.x constructs and somehow making it compatible with a 3.x compiler (the way the question is phrased is ambiguous with respect to this). I make this assumption because:

  • If you decide you want to use language features in your source code that aren't supported by older compiler versions, you are (whether you realize it or not) making a decision to drop support for building the project using those older compiler version. If you have a strong reason to want to support building the project using those older compilers, then I'm pretty sure you just have to not use those newer language features (or somehow convince the maintainers of the compiler to backport those changes to older compiler versions, which I think is pretty rare).

  • I'm not personally aware of any reasons not to upgrade your compiler version unless you have very strict security policies and require your dependencies and build tooling to be audited. I'd wager that that's pretty rare in the JavaScript development scene where the landscape is known for changing rapidly.

downlevel-dts

注意:TypeScript 具有“降级”其发出的 JavaScript 的功能,可将 ECMA Script 标准较新版本的语言结构转换为可在旧版本中使用的结构。 (看the compileOptions.targettsconfig 字段 https://www.typescriptlang.org/tsconfig#target).

据我所知,TypeScript 本身没有这样的功能来降低级别typings它发出的文件(包括撰写本文时的三斜杠指令),但 Nathan Sanders(Definitely Typed 的维护者)维护一个开源项目,downlevel-dts, 降级 .d.ts 文件 https://github.com/sandersn/downlevel-dts它可以将打字一直降低到 typescript v3.4 语法。

package.json.typesVersions 和 semver-ts.org

semver-ts.org 的“‘降级’类型”部分 https://www.semver-ts.org/#downleveling-types解释了如何为引入了新的非向后兼容语言构造的每个打字稿版本编写降级类型的脚本,以及如何告诉包用户的编译器要使用哪个版本的类型以及在哪里可以找到它们:

当新版本的 TypeScript 包含向后不兼容的更改时发出的类型定义,就像他们在3.7 https://github.com/microsoft/TypeScript/pull/33470,直接改变类型的策略可能行不通。但是,仍然可以使用以下组合来提供向后兼容的类型下层dts https://github.com/sandersn/downlevel-dts and 类型版本 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-1.html#version-selection-with-typesversions。 (在某些情况下,这可能还需要对类型进行一些手动调整,但这对于大多数包来说应该很少见。)

  • The downlevel-dts工具允许您采取.d.ts对于早期版本的 TypeScript 无效的文件(例如,对类字段发出的更改中提到的重大变化 https://www.semver-ts.org/#breaking-changes),并发出与该版本兼容的版本。它支持针对 3.4 之后的所有 TypeScript 版本。

  • TypeScript 支持使用typesVersions键入一个package.json文件来指定一组特定的类型定义(可能包含一个或多个.d.ts文件)对应于特定的 TypeScript 版本。

推荐的流程如下:

为了避免从场外材料中复制太多(抄袭),我将用自己的话总结这些步骤(请阅读带有示例的完整步骤的源代码):

  1. Install downlevel-dts作为开发依赖项(以及其他一些辅助工具)。
  2. Call downlevel-dts将类型降级为您想要支持的旧类型声明版本(这可以编写脚本)。
  3. 更新您的 package.json 以在生成最新类型声明版本的类型后注册调用您的脚本。
  4. 使用以下命令在 package.json 文件中注册生成的旧版本类型声明文件typesVersions field.
  5. 确保生成的文件包含在包的文件中(更新files字段,或您正在使用的任何类似字段)。

的局限性downlevel-dts

请注意,存在一些限制。以下是引自downlevel-dts的自述文件:

请注意,并非所有功能都可以降低级别。例如,TypeScript 4.0 允许在元组中的任何位置分布多个元组类型变量。这在以前的版本中是不允许的,但没有明显的下层发射,因此下层 dts 不会尝试执行任何操作。请务必使用适当版本的 TypeScript 测试 downlevel-dts 的输出。

其他提议的解决方案的问题方面:

  • “使用较旧的打字稿版本来发出您的打字”

    • 这假设问题的提出者正在使用 TS 编译器从 .ts 文件发出类型,并且如果他们手动维护它们则不起作用,这对于首先用 JS 编写的非常大的项目来说通常是这种情况没有带宽迁移到 TS。
    • 这可能需要你制作你的 .ts源代码 to not use在比编译器更新的版本中引入的 TypeScript 语言构造,您必须使用它来发出要发出的 TypeScript 语言版本中的类型。这并不理想,因为使用较新的语言结构编写代码可能会更干净,或者不可能仅使用较旧的结构来执行某些操作。
  • “维护两种 TypeScript 语言版本的类型”

    • 这似乎做出了相反的假设:该项目为手动编写的 JS 代码维护手动类型文件,而不是转换为 .js 并从 .ts 文件发出 .d.ts。
    • 这是一个big维护负担(手动维护.d.ts文件已经是很大的维护负担了!)。对于小型项目来说这可能是可以接受的,但对于具有大型或复杂 API 表面的库来说则不然。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使 4.X Typescript 项目与旧版本的 Typescript(如 3.X)兼容? 的相关文章

随机推荐

  • 哈希 freezeset 与排序元组

    在 Python 中 给定一组可比较的 可散列的元素s 散列是否更好frozenset s or tuple sorted s 这取决于你在做什么 创建一个更快frozenset 比排序tuple but frozenset占用的内存比tu
  • 在基本 Tensorflow 2.0 中运行简单回归

    我正在学习 Tensorflow 2 0 我认为在 Tensorflow 中实现最基本的简单线性回归是一个好主意 不幸的是 我遇到了几个问题 我想知道这里是否有人可以提供帮助 考虑以下设置 import tensorflow as tf 2
  • 检查外部图像是否存在的正确 PHP 方法?

    我知道至少有 10 个相同的问题有答案 但似乎没有一个对我来说完美无缺 我正在尝试检查内部或外部图像是否存在 图像 URL 是否有效 fopen url r 失败 除非我使用 fopen Warning fopen http example
  • IE9 中的无效字符 DOM 异常

    以下这段 JS 曾经在 IE8 中工作 现在在 IE9 中失败 document createElement 我收到以下异常 SCRIPT5022 DOM 异常 INVALID CHARACTER ERR 5 上面这段代码是不是不符合标准呢
  • 电子邮件模板中的剪贴板功能

    我想在电子邮件模板中发送优惠券代码 一个小按钮 用于复制剪贴板上输入元素的内容 通过电子邮件模板 我的意思是我想发送一封电子邮件 其中包含优惠券代码 并且电子邮件模板中会有一个按钮 允许我将其复制到剪贴板 这可以做到吗 任何帮助将不胜感激
  • 如何使用 std::string 创建条件断点

    假设我有这个功能 std string Func1 std string myString do some string processing std string newString Func2 myString return newSt
  • 如何获取从 Express (Node.js) 中的表单传递的数据

    我想获取使用表单从页面传递的数据 并在重定向的页面中使用该数据 我的客户端有这个表格
  • 为什么我从 c# 到 js 得到不同的 MD5 哈希值?

    我有一个用于加密密码的 C 函数 System Security Cryptography MD5CryptoServiceProvider md5Provider new System Security Cryptography MD5C
  • 如何在Git中手动合并所有文件?

    我想合并所有文件manually有了 meld 或任何其他 diff 工具 我如何使用 Git 来做到这一点 当我跑步时git mergetool它说no files need merging 所以我想只有当我有冲突时我才能做到这一点 有更
  • 如何在 R 中解析堆叠多个 JSON 的文件?

    我在 R 中有以下 堆叠 JSON 对象 example1 json ID 12345 Timestamp 20140101 Usefulness Yes Code event1 A result 1 ID 1A35B Timestamp
  • GLSL 中统一浮点行为和常量浮点行为的不同

    我正在尝试在 GLSL 中实现模拟双精度 并且观察到一种奇怪的行为差异 导致 GLSL 中出现细微的浮点错误 考虑以下片段着色器 写入 4 浮点纹理以打印输出 layout location 0 out vec4 Output unifor
  • 加载带有月份标题的 recyclerview 不同类型适配器

    如果从 api 获取不同的月份名称 则尝试将月份名称显示为标题 在这里 我加载月份标题 但是当我加载标题时 它不会加载其他视图 如果数据不同 我需要将月份加载为标题 并且还加载其他视图持有者 我看到一些例子 他们都在 Model 类中使用
  • PySpark DataFrame 上分组数据的 Pandas 式转换

    如果我们有一个由一列类别和一列值组成的 Pandas 数据框 我们可以通过执行以下操作来删除每个类别中的平均值 df DemeanedValues df groupby Category Values transform lambda g
  • 将当前类作为 scala 中的参数传递

    如何传递当前类作为参数 在java中我们这样做 mymethod this class or mymethod MyClass class 如何将 scala 当前类传递给此方法 this getClass or classOf MyCla
  • Groovy:如何测试属性访问是否成功?

    我有一个变量 Object foo 它不为空 我想使用 foo bar 但前提是它不会用 没有这样的属性 类的栏 无论什么 来轰炸我 我应该如何进行以下测试 if test here use foo bar Use object hasPr
  • ASP.NET MVC 视图引擎解析顺序

    我创建了一个简单的 ASP NET MVC 1 0 版应用程序 我有一个 ProductController 它有一个操作索引 在视图中 我在Product子文件夹下创建了相应的Index aspx 然后我引用了 Spark dll 并在同
  • 验证域用户凭据

    我需要一种方法来验证 Windows 上本机 C 的用户 密码对 输入的是用户名和密码 用户可以是 DOMAIN user 格式 基本上我需要编写一个函数 如果用户 密码是有效的本地帐户 则返回 true 第1部分 如果用户 密码在给定的域
  • Silverlight 4 PLINQ

    我有一个非常简单的问题 是否可以将 PLINQ 与 Silverlight 4 一起使用 因为它似乎不存在于最常引用的程序集中 它不受支持 但您可以在这里投票 http dotnet uservoice com forums 4325 si
  • ruby 中的树和图数据结构[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我很难找到在 ruby 中使用的树数据结构 我可以研究一些众所周知的吗 我的要求很简单 我想创建一棵树 或者可能是一个图 并找到一些节点之
  • 如何使 4.X Typescript 项目与旧版本的 Typescript(如 3.X)兼容?

    如何使基于 TS 4 X 构建的软件包与 3 X 兼容 例如 如果我有较新的版本 则使用新功能 否则使用any or unknown或旧版本支持的任何内容 有没有可能使用指令 https www typescriptlang org doc