深色模式
TypeScript
复习方式:先遮住答案口述 30~90 秒,再核对关键点;“追问与易错点”用于进一步练习。
1. TypeScript 能保证运行时安全吗?
展开答案与追问
参考答案: 它主要提供静态类型检查,类型通常在编译后被擦除。接口返回、用户输入和本地存储仍需运行时校验。类型断言 as 只影响编译器判断,不会转换或验证实际值。
追问与易错点: 接口返回值先作为 unknown,再用类型守卫或 schema 校验。
2. any、unknown、never 有什么区别?
展开答案与追问
参考答案: any 会绕过大量类型检查;unknown 能接收任意值,但使用前必须缩小类型;never 表示不可能出现的值,常用于不返回的函数或穷尽检查。优先用 unknown 表示不可信输入。
追问与易错点: void 表示不关心返回值,不等于 never。
3. interface 与 type 如何选择?
展开答案与追问
参考答案: 二者都能描述对象结构;interface 支持声明合并,适合可扩展契约;type 可表达联合、条件、映射等类型。不要笼统认为 interface 能继承而 type 完全不能组合,type 可用交叉类型组合。
追问与易错点: 冲突属性在接口扩展时通常直接报错,交叉类型可能形成不可用的 never 属性。
4. 泛型解决什么问题?
展开答案与追问
参考答案: 泛型保留输入输出之间的类型关系,避免全部写成 any。例:function first<T>(xs: T[]): T | undefined { return xs[0]; }。约束 T extends { id: string } 表示只接受满足结构的类型。
追问与易错点: 泛型不是越多越好;没有表达关系的泛型往往没有必要。
5. 如何做类型缩小与穷尽检查?
展开答案与追问
参考答案: 通过 typeof、in、instanceof、自定义类型谓词和可辨识联合缩小范围。联合成员使用同一个字面量字段,如 status;switch 穷尽后把剩余值赋给 never,可在新增分支时触发编译错误。
追问与易错点: 不要用非空断言 ! 掩盖真实的空值分支。
6. 常见工具类型有什么用途?
展开答案与追问
参考答案: Partial 让属性可选,Required 让属性必选,Readonly 限制赋值,Pick/Omit 选择或排除键,Record 构造键值映射,ReturnType 提取函数返回类型,Awaited 解析 await 后的类型。多数对象工具类型仅作用于一层。
追问与易错点: Readonly 不会在运行时冻结对象,也不是递归只读。