TypeScript instanceof 如何收窄实例,跨 iframe 为什么可能判断失败?
从原型链解释 instanceof 的运行时证据,展示受控类实例与普通对象的差异,说明多份构造器、跨 realm 数组以及接口和 JSON 数据的边界。
程序员面试题库第 91 页,收录第 4501–4550 题,共 5000 道完整解析,覆盖前端、JavaScript、React、Vue、Node.js、AI Agent、网络、数据库与系统设计。
按稳定语义路径排序
从原型链解释 instanceof 的运行时证据,展示受控类实例与普通对象的差异,说明多份构造器、跨 realm 数组以及接口和 JSON 数据的边界。
围绕“TypeScript 中字面量拓宽会让对象的字面量标签变成 string,as const 如何帮助判别联合成立”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确对象字面量属性默认拓宽导致标签失去字面量类型、as const 冻结后判别才生效的机制。
按请求状态与内容类型两层组织联合,展示逐层检查和保留局部关联,解释嵌套标签向父对象反推的限制、解构 rest 丢失关联与状态组合建模。
围绕“TypeScript 的非空断言操作符 ! 与正常的空值收窄相比,各自适用什么场景”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 ! 是从类型中移除 null/undefined 的断言而非检查,给出 DOM 已确认存在等可接受场景与风险边界。
围绕“TypeScript 中 ?? 和 ?. 如何参与空值收窄,与 || 的行为差异是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 ?? 只对 null/undefined 生效而 || 对所有 falsy 生效这一差异对收窄结果的影响。
围绕“TypeScript 中可选参数配合默认值后,函数体内该参数的类型会如何变化”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确「参数声明 string | undefined 但提供默认值后函数体内视为 string」这一规则。
围绕“如何用 TypeScript 判别联合建模一组状态变更事件,让处理函数的分支既收窄又穷尽”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出事件联合 + 处理函数中按 type 收窄 payload、default 走 never 检查的实战结构,强调与框架无关。
围绕“TypeScript 的 strictNullChecks 与类型收窄是什么关系,关掉它会失去哪些收窄能力”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确空值收窄(可选链、等值判断、非空断言的意义)完全建立在 strictNullChecks 之上。
围绕“TypeScript 的 switch 中 case 落空(fall-through)会如何影响类型收窄的结果”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确无 break 落空时收窄取多个 case 的并集这一行为,以及与 noFallthroughCasesInSwitch 的关系。
围绕“TypeScript 5.3 支持的 switch(true) 收窄是什么,它解决了什么写法问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 case 表达式中的类型守卫现在能收窄 switch(true) 分支内的变量。
围绕“TypeScript 中能否通过 Symbol.hasInstance 自定义 instanceof 的收窄行为,有”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确运行时行为可自定义但静态收窄仍按右侧构造器的 prototype 类型推导的错位。
区分真值判断与空值判断,解释零、空串、false 和 NaN 的分支行为,比较显式 null 检查、空值合并与逻辑或,并给出保留有效零值的写法。
围绕“TypeScript 自定义类型守卫可能「撒谎」,如何保证守卫实现与谓词类型一致”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出编译器不验证守卫函数体、错误实现会造成不健全收窄,并给出校验库或断言验证的对策。
列出 typeof 的运行时分类,说明 null、数组与普通对象的区别,演示先排除空值再检查属性,并区分运行时 typeof 与类型位置的 typeof 查询。
围绕“TypeScript 中处理外部数据时,为什么 unknown 配合收窄比 any 更安全”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 unknown 禁止未收窄的使用、强制建立运行时校验边界,而 any 跳过一切检查。
沿条件分支、提前返回和重新赋值解释控制流分析,区分声明类型与当前位置观察类型,并说明闭包和可变属性为什么可能失去已有的收窄证据。
围绕“如何实现 Abs<T extends number> 将负数转为正数字面量类型?关键在哪里”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕利用模板字面量和 infer 判断符号。
围绕“如何将数组或元组类型转换为联合类型?两种写法有什么不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖给出 [number] 和 number[] 的不同处理方式。
围绕“Awaited 工具类型是如何递归解包 Promise 嵌套的?它和手动 infer 有何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖专门说明 Awaited 的内部实现与 PromiseLike 处理,不牵扯 thenable 细节。
从可赋值性解释条件类型的判断分支,展示按结构提取 message 类型,区分外部泛型约束与内部条件,并说明类型分支不等于运行时校验或数据转换。
围绕“ConstructorParameters 和 InstanceType 是如何通过条件类型和 infer 抽取构造”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖限定这两个与构造函数相关的工具类型。
围绕“实现 DeepMutable 将一个只读类型里所有属性及嵌套对象都变为可变,需要注意哪个陷阱”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖只解决只读到可变的递归转写。
围绕“如何编写 DeepPartial 让嵌套对象所有层级属性都变为可选?需要考虑哪些边界情况”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖要求实现一个深度可选类型并提示处理数组、函数等边界,但不扩展到 immutable 等变体。
围绕“实现 DeepReadonly 时如何保留原始对象的方法类型?如何处理 Date、Map 等”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖只针对 DeepReadonly 的边界场景。
围绕“在条件类型或映射类型中,泛型参数的默认值(T=never)会影响结果吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖只说明为类型参数提供默认值的实际效果和分配影响。
对比逐成员包装和整体包装,解释裸类型参数、元组包裹、过滤联合与 never 的空联合行为,并说明 any 和复杂条件不能套用简单分发口诀。
围绕“如何递归将嵌套数组类型(如 [1, [2, [3]]])展平为单一数组元素类型”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕专门实现 Flat<Arr> 并注意任意深度。
用逐元素包装展示 keyof T 同态映射对数组、元组和只读修饰的支持,对照键重映射后的普通对象形态,并说明长度、可选元素及运行时转换边界。
围绕“实现一个类型使函数参数提取为元组时保留可选标记?可选参数在 Parameters 中如何表现”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖专门回答可选参数在 Parameters 中的体现(如 x?: number 转为 [x?: number] 还是 [number | 。
围绕“如何用 infer 从数组类型中提取前若干个元素(如一次取两个)?如何适应不同长度的元组”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕只演示提取固定数量的模式。
围绕“infer 关键字在条件类型中扮演什么角色?给出一个自定义类型提取函数返回值的例子”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖只讲 infer 在条件类型中的位置和基本用途,不深入递归或协变/逆变。
区分结构中多个 infer 候选的合并、联合输入分发和重载函数签名提取,展示输出位置联合与输入位置交叉,并说明无法据此模拟实际重载调用选择。
比较四种内置大小写类型操作的范围,展示 Unicode 大写扩展与宽字符串约束,说明非区域化处理、运行时实现和生成键名冲突等边界。
围绕“如何判断一个类型是 never?为什么直接使用 T extends never 不行”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖只解释 isNever 的写法和 never 的底层特性,不引入其他特殊类型判断。
围绕“如何判断一个类型是否为元组类型?为什么元组和数组需要区分”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖仅聚焦于判断元组的条件类型实现及原因。
使用模板字面量与 Capitalize 创建 getter 键,说明 never 过滤、字符串键限制和键冲突,并区分类型重命名与实际对象转换。
围绕“映射类型中 keyof any 能产生哪些键值?为什么常用它来遍历可用属性名”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖只解释 keyof any的作用域和用途。
围绕“如何使用 infer 提取数组类型最后一个元素的类型?空数组的边界如何处理”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕专门实现 Last<Arr> 并说明 never 的处理,不与其他数组操作混在一起。
围绕“在没有运行时的条件下,仅靠类型能否比较字符串字面量长度(如判断更长)”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明比较需构造元组辅助类型且可能有深度问题,不提供实现,只从可判定角度回答。
围绕“为事件映射表写一个 Lookup 类型,如何根据事件名提取对应的 payload 类型”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕仅用索引访问类型即可。
从有限键联合和 keyof 映射解释新对象类型生成,展示保留字段关系与只读可选修饰符,区分任意字符串索引、运行时对象创建和浅层类型变换。
围绕“映射类型里 -? 和 -readonly 修饰符起什么作用?它们如何覆盖原有修饰符”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖单独说明用 -? 和 -readonly 去除修饰,不提及 + 号。
围绕“如何合并两个对象类型,使得右类型覆盖左类型但保留未重复的属性”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕只写一个 Merge<A,B>,区别于交集。
围绕“Omit 工具类型是如何基于 Pick 和 Exclude 实现的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕单问 Omit 的实现路径,不延伸至其他工具类型的关联。
围绕“Parameters 和 ReturnType 工具类型是如何用 infer 实现的?它们适用于函数类型吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖只说明这两个工具类型的内部实现和适用函数类型,不泛谈 infer 其它用法。
围绕“如何用映射类型手动实现 Pick、Exclude 和 Record?它们的关键差异在哪”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖只回答这三个工具类型的独立实现,不横向对比所有工具类型。
围绕“如何用类型运算符实现从元组类型中移除最后一个元素的效果”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕狭义的 TrimRight,只针对元组移除末尾。
围绕“如何利用 infer 从对象类型中提取某个属性的类型(如属性值的类型)”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖只讲直接取对象属性类型的方法,与模板字面量无关。
围绕“在条件类型中使用递归来解析字符串(如将 '1+2' 类型计算为 3)时需要注意哪些限制”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖专门讨论递归条件类型的终止条件和深度限制,不赘述基本递归类型。
围绕“递归类型是如何通过接口或类型别名定义的?JS 的递归思维有何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕只介绍定义递归类型的基本方式和约束,不深入条件递归。