严格模式与常见陷阱
strict: true 打开一组相关检查;理解它们能少踩「编译过、运行炸」的坑。
strict 族(节选)
| 选项 | 作用 |
|---|---|
strictNullChecks | null / undefined 不能随意赋给普通类型 |
strictFunctionTypes | 函数参数更严格的逆变检查 |
noImplicitAny | 推不出类型时禁止默默变 any |
strictPropertyInitialization | 类属性必须在构造时初始化 |
新项目直接 strict: true;老项目可逐项打开。
常见陷阱
1. any 传染
const data: any = JSON.parse(text);
data.foo.bar; // 全程无检查
改用 unknown + 校验 / schema(如 zod)再收窄。
2. 类型拓宽(widening)
let theme = "dark"; // string,不是 "dark"
theme = "light";
const themeConst = "dark"; // "dark"
需要字面量时用 as const 或显式字面量联合类型。
3. 断言掩盖错误
const user = raw as User; // 形状不对也会信
断言不验证字段;边界用校验函数。
4. 编译时 ≠ 运行时
接口、类型别名在运行时被擦除。不能 instanceof 一个 interface;需要的话用可辨识字段或校验函数。
要点
- 新项目开
strict - 堵住
any入口 - 注意字面量拓宽
- 牢记类型会被擦除