【问题标题】:How to make 4.X Typescript project compatible with older version of Typescript 3.X?如何使 4.X Typescript 项目与旧版本的 Typescript 3.X 兼容?
【发布时间】:2022-08-18 03:15:00
【问题描述】:

如何使构建在 TS 4.X 之上的包与 3.X 兼容?比如,如果你有新版本 -> 使用新功能,否则 -> 使用 anyunknown 或旧版本支持的任何内容。

有没有可能为此目的使用directives

  • TS 4 具有一些 TS 3 中不存在的功能
  • 正确,但是如果我想有条件地忽略它们怎么办?比如,如果你有 TS 4 -> 使用新功能,否则 -> 回滚到 any 或其他东西
  • 您只需要为您的项目支持两个版本的类型声明
  • 我想过,但从可维护性的角度来看,它更难。我想知道是否有另一种方法。
  • AFAIK,这是不可能的。没有功能标志

标签: javascript typescript compatibility


【解决方案1】:

在 TypeScript 中无法在支持和不支持的功能之间切换。

例如,如果您有一个基于 TS 4.0variadic tuple types 构建的库,则无法在使用 TS 3.0 的包中使用它。

但是,您可以维护两个版本的分型:TS4 之前和 TS4 之后。例如,看看lodashreact 如何维护多个版本的类型。

【讨论】:

    【解决方案2】:

    你可以在你的 npm 中安装一个旧版本的打字稿(无论你想要什么,例如:`npm i --dev typescript@3.5.2)并尝试修复错误。然后将 typescript 版本恢复为 v4 或任何它已经存在的版本。

    现在您的代码与指定的旧打字稿版本兼容(只需确保代码的功能在更新时不会改变)。

    【讨论】:

    • 谢谢!但我接下来要实现的是:1)如果用户有 TS 4,则使用类型中的新功能。 2) 如果用户有 TS 3,则回滚到 anyunknown 或旧库支持的任何内容。但我认为 TS 中没有这样的功能,我也不能将编译器配置为以这种方式运行......
    【解决方案3】:

    注意:TypeScript 具有“降级”它发出的 JavaScript 的功能,用于将语言结构从更高版本的 ECMA 脚本标准转换为在旧版本中工作的结构。 (见the compileOptions.target field of tsconfig)。

    据我所知,TypeScript 本身并没有这样的功能来降低打字它发出的文件(包括撰写本文时的指令),但 Nathan Sanders(Definite Typed 的维护者)maintains an open-source project, downlevel-dts, to downlevel .d.ts files 可以将类型一直降低到 typescript v3.4 语法。

    您将需要以某种方式将其连接到您的构建过程中。

    以下是我认为其他提议的解决方案可能存在的问题:

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

      • 这假设提问者正在使用 TS 编译器从 .ts 文件中发出类型,并且如果他们手动维护它们就不起作用,这通常是最初用 JS 编写的非常大的项目的情况并且没有带宽迁移到 TS。
      • 这可能需要您制作 .ts源代码不使用在比编译器更新的版本中引入的 TypeScript 语言结构,您必须使用它来发出要发出的 TypeScript 语言版本中的类型。这并不理想,因为使用较新的语言结构编写代码可能会更简洁,或者仅使用较旧的结构来做某事是不可能的。
    • “维护两个 TypeScript 语言版本的类型”

      • 这似乎做出了相反的假设:该项目为手动编写的 JS 代码维护手动输入文件,而不是被转译为 .js 并从 .ts 文件发出 .d.ts。
      • 这是一个大的维护负担(手动维护.d.ts文件已经是一个很大的维护负担!)。它可能适用于小型项目,但不适用于具有大型或复杂 API 表面的库。

    【讨论】:

      猜你喜欢
      • 2019-06-28
      • 2018-04-06
      • 2013-07-01
      • 2018-08-29
      • 2020-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      相关资源
      最近更新 更多