1043 words
5 minutes
TSConfig 向后兼容性配置
2025-02-27 10:02:48
2025-02-27 15:33:13

← 返回 TSConfig 参考指南


字符集 - charset#

在 TypeScript 的早期版本中,此选项用于控制从磁盘读取文本文件时使用的编码。现在,TypeScript 默认使用 UTF-8 编码,但会正确检测 UTF-16(BE 和 LE)或 UTF-8 的 BOM。

已废弃

默认值:utf8

发布版本:1.0

未用作值的导入 - importsNotUsedAsValues#

已被 verbatimModuleSyntax 取代。

此标志控制 import 的工作方式,有 3 个不同的选项:

  • remove:默认行为,删除仅引用类型的 import 语句。

  • preserve:保留所有值或类型从未使用的 import 语句。这可能导致导入/副作用被保留。

  • error:保留所有导入(与 preserve 选项相同),但当值导入仅用作类型时会报错。如果你想确保没有意外导入值,但仍然希望明确副作用导入,这可能会很有用。

此标志之所以有效,是因为你可以使用 import type 来显式创建一个永远不应该被编译到 JavaScript 中的导入语句。

默认值:remove

允许值:

  • remove
  • preserve
  • error

相关配置:

  • preserveValueImports
  • verbatimModuleSyntax

发布版本:3.8

仅字符串键名 - keyofStringsOnly#

此标志会改变 keyof 类型运算符的行为,当应用于具有字符串索引签名的类型时,返回 string 而不是 string | number。

此标志用于帮助人们保持 TypeScript 2.9 发布之前的行为。

已废弃

发布版本:2.9

不使用隐式严格模式 - noImplicitUseStrict#

你应该不需要这个选项。默认情况下,当将模块文件编译到非 ES6 目标时,TypeScript 会在文件顶部生成 “use strict” 序言。此设置会禁用该序言。

发布版本:1.8

不进行严格泛型检查 - noStrictGenericChecks#

TypeScript 在比较两个泛型函数时会统一类型参数。

type A = <T, U>(x: T, y: U) => [T, U]; type B = <S>(x: S, y: S) => [S, S]; function f(a: A, b: B) { b = a; // 正确 a = b; // 错误 // 类型 'B' 不能赋值给类型 'A'。 // 参数 'y' 和 'y' 的类型不兼容。 // 类型 'U' 不能赋值给类型 'T'。 // 'T' 可能被实例化为与 'U' 不相关的任意类型。 }

此标志可用于移除该检查。

发布版本:2.5

输出 - out#

请使用 outFile 代替。

out 选项以不可预测或不一致的方式计算最终文件位置。此选项仅为向后兼容性而保留,已被废弃。

已废弃

相关配置:

  • outDir
  • outFile

发布版本:1.0

保留值导入 - preserveValueImports#

已被 verbatimModuleSyntax 取代。

在某些情况下,TypeScript 无法检测到你正在使用导入。例如,以下代码:

import { Animal } from "./animal.js"; eval("console.log(new Animal().isDangerous())");

或者使用”编译到 HTML”的语言,如 Svelte 或 Vue。preserveValueImports 将阻止 TypeScript 删除导入,即使它看起来未被使用。

当与 isolatedModules 结合使用时:导入的类型必须标记为仅类型,因为一次处理单个文件的编译器无法知道看起来未使用的导入是值,还是必须删除以避免运行时崩溃的类型。

相关配置:

  • isolatedModules
  • importsNotUsedAsValues
  • verbatimModuleSyntax

发布版本:4.5

禁止过量属性错误 - suppressExcessPropertyErrors#

此选项禁用过量属性错误的报告,如以下示例所示:

type Point = { x: number; y: number }; const p: Point = { x: 1, y: 3, m: 10 }; // 对象字面量只能指定已知属性,并且 'm' 在类型 'Point' 中不存在。

此标志是为了帮助人们迁移到 TypeScript 1.6 中更严格的新对象字面量检查。

我们不建议在现代代码库中使用此标志,你可以使用 // @ts-ignore 来抑制需要的一次性情况。

发布版本:1.6

禁止隐式任意索引错误 - suppressImplicitAnyIndexErrors#

启用 suppressImplicitAnyIndexErrors 将禁止报告关于对象索引隐式 any 的错误,如以下示例所示:

const obj = { x: 10 }; console.log(obj["foo"]); // 元素隐式具有 'any' 类型,因为类型为 '"foo"' 的表达式不能用于索引类型 '{ x: number; }'。 // 属性 'foo' 在类型 '{ x: number; }' 上不存在。

使用 suppressImplicitAnyIndexErrors 是一种相当激进的方法。建议使用 @ts-ignore 注释代替:

const obj = { x: 10 }; // @ts-ignore console.log(obj["foo"]);

相关配置:

  • noImplicitAny

发布版本:1.4

TSConfig 向后兼容性配置
https://0bipinnata0.my/posts/typescript/tsconfig/07-backwards-compatibility/
Author
0bipinnata0
Published at
2025-02-27 10:02:48