总开关,一次性启用七个严格检查:noImplicitAny、strictNullChecks、strictFunctionTypes、strictBindCallApply、strictPropertyInitialization、noImplicitThis 和 useUnknownInCatchVariables。新项目必开。老项目用 `// @ts-nocheck` 逐文件迁移。
"strict": true
⚠ 注意 在大型老项目里开启 strict 可能一下冒出几千个错误。迁移期间在最嘈杂的文件顶部加 `// @ts-nocheck`,而不是逐行压制。
noImplicitAnyboolean默认: false (true with strict)
当 TS 因缺少类型信息而推断出 `any` 时报错。最常见触发场景是未注解的函数参数:` function foo(x)` 会报错,必须写 `function foo(x: string)`。
"noImplicitAny": true
strictNullChecksboolean默认: false (true with strict)
让 `null` 和 `undefined` 成为独立类型,不再能赋给任何类型。没这个 flag 时,忘记处理 null 是静默 bug。开了之后必须显式检查、用非空断言(`!`),或在联合类型里包含 `null`。
"strictNullChecks": true
⚠ 注意 迁移时最常漏掉的是给可能返回空的函数的返回类型补 `| null | undefined`。
strictFunctionTypesboolean默认: false (true with strict)
对回调位置的函数参数类型强制逆变检查。能捕获一类微妙 bug:传入的函数只接受比回调期望的更窄的类型。方法声明(非箭头函数)依然按双变处理以保持兼容性。
"strictFunctionTypes": true
strictBindCallApplyboolean默认: false (true with strict)
对 `bind`、`call`、`apply` 的参数进行严格类型检查。没开时这些方法接受任意 `any` 参数,开了才能根据函数签名正确校验。
"strictBindCallApply": true
strictPropertyInitializationboolean默认: false (true with strict)
对类中声明但未在构造函数里初始化的属性报错。需要同时开 `strictNullChecks`。只有在真正能保证构造函数外初始化顺序时(如依赖注入)才用确定赋值断言(`!`)。
"strictPropertyInitialization": true
⚠ 注意 不要把每个属性都加 `!` 来压掉报错,那样等于没开这个检查。只在生命周期钩子或框架注入初始化的属性上用。
noImplicitThisboolean默认: false (true with strict)
当 `this` 隐式为 `any` 类型时报错。常见于 TS 无法判断 `this` 类型的独立函数和对象字面量里。修复方法:在函数签名中加 `this: ClassName` 参数。
"noImplicitThis": true
useUnknownInCatchVariablesboolean默认: false (true with strict)TS 4.0
让 `catch` 子句的错误变量类型变为 `unknown` 而不是 `any`。强制在访问前先收窄类型,因为 `throw` 可以抛任何值,不只是 `Error` 实例。
"useUnknownInCatchVariables": true
⚠ 注意 用 `if (error instanceof Error)` 或类型守卫处理,不要不加检查直接 `as Error`,因为 `throw "字符串"` 是合法的 JavaScript。
noUnusedLocalsboolean默认: false
对声明了但从未使用的局部变量报错。故意不用的变量用 `_` 前缀(如回调里的 `_index`)可压制报错而无需删除。
"noUnusedLocals": true
noUnusedParametersboolean默认: false
对声明了但从未使用的函数参数报错。和 `noUnusedLocals` 一样,用 `_` 前缀标记故意不用的参数。
"noUnusedParameters": true
noImplicitReturnsboolean默认: false
当非 void 函数中并非所有代码路径都有 `return` 时报错。防止复杂 if/else 链里漏掉 else 分支的 return 这类经典 bug。
"noImplicitReturns": true
noFallthroughCasesInSwitchboolean默认: false
对 switch 里非空且未用 `break`/`return`/`throw` 结束而落空到下一个 case 的情况报错。多个空 case 连写(如 `case X: case Y:`)仍然允许。
"noFallthroughCasesInSwitch": true
exactOptionalPropertyTypesboolean默认: falseTS 4.4
区分"属性不存在"和"属性被显式设为 undefined"。可选属性 `x?: string` 只允许赋字符串或完全省略 `x`,把 `obj.x = undefined` 写进去是错误。这是最精确的可选属性建模。
"exactOptionalPropertyTypes": true
⚠ 注意 很多老代码用 `obj.x = undefined` 来"清除"属性。开了这个 flag 必须改为 `delete obj.x`,或把类型改成 `x?: string | undefined`。
noUncheckedIndexedAccessboolean默认: falseTS 4.1
在数组下标访问和索引签名访问的返回类型里加入 `undefined`。因为 `arr[5]` 可能越界,TS 要求访问前先检查 `arr[5] !== undefined`。能抓到一类非常常见的运行时错误。
"noUncheckedIndexedAccess": true
⚠ 注意 `strict` 不会自动开这个,要手动选择。在大量操作数组的代码里会比较吵。确定下标一定存在时用 `arr[i]!`(非空断言)。
noPropertyAccessFromIndexSignatureboolean默认: false
要求通过索引签名定义的属性必须用方括号(`obj["key"]`)而非点符号(`obj.key`)访问。让"安全"访问(已声明属性)和"动态"访问(索引签名)在视觉上一目了然。
"noPropertyAccessFromIndexSignature": true