# 1. noPropertyAccessFromIndexSignature 在 Monorepo 与项目引用的协作 A 索引签名属性可以用点访问不受限制 B 该选项禁止所有对象属性访问 C noPropertyAccessFromIndexSignature 禁止点访问索引签名属性,强制括号访问 ✓ 正确答案 D 该选项只影响运行时
# 2. this 参数类型在链式 API 与 Builder 模式的应用 A this 参数类型只在运行时生效 B Builder 模式无法用类型约束 C this 参数会出现在运行时参数列表 D 方法声明 this 参数并返回 this,配合泛型状态可实现类型安全的链式 Builder API ✓ 正确答案
# 3. DeepReadonly<T> 的递归实现与类型深度限制 A DeepReadonly 会递归展开函数类型 B DeepReadonly 递归映射对象并让数组/叶类型终止递归,受实例化深度限制(约 50 层),复杂结构需拆中间类型治理 ✓ 正确答案 C 递归类型没有深度限制 D 数组元素不会被递归处理
# 4. Omit<T, K> 在 React Props 与表单字段裁剪的应用模式 A Omit 只能用于接口类型 B Omit 无法作用于可选属性 C Omit 会改变属性的可选性 D Omit 可剔除原生 HTML 属性以派生组件 Props、裁剪实体内字段建模表单(新建/编辑/展示),常与 Pick/Partial 组合 ✓ 正确答案
# 5. TypeScript 编译产物的类型擦除与运行时元数据的边界 A 接口在编译产物中保留供 instanceof 使用 B enum 在产物中完全消失 C 类型谓词会自动生成运行时检查 D TS 产物擦除全部纯类型信息,泛型实例化类型运行时不可见,需要运行时类型信息时用装饰器元数据、schema 或代码生成 ✓ 正确答案
# 6. 类型级 Branded Types + Phantom Types 在测试与 CI 的工程价值 A 品牌类型在运行时检查值的来源 B Branded/Phantom Types 在类型层模拟名义类型(如 UserId 与 string 隔离、单位维度约束),擦除后零运行时开销,可把领域不变量编码为编译期契约 ✓ 正确答案 C 品牌类型与普通 string 可互赋 D Phantom 类型参数会出现在产物中
# 7. 类型级 CSS-in-JS(vanilla-extract) A vanilla-extract 在运行时注入样式 B vanilla-extract 在构建期生成静态 CSS,并用类型约束 CSS 属性与主题 token 引用,实现样式契约编译期校验 ✓ 正确答案 C 样式属性不需要类型检查 D vanilla-extract 与 Design Tokens 无关
# 8. 类型级 EventEmitter 签名 在测试与 CI 的工程价值 A 事件名与载荷类型可以任意搭配 B 类型级 EventEmitter 用 keyof + 索引访问约束事件名与载荷,测试与 CI 中把事件契约变更暴露为编译错误 ✓ 正确答案 C emit 的载荷参数不受类型约束 D 监听器可以监听任意事件名
# 9. 递归类型边界与函数类型在工具类型中的处理 A 递归工具类型需将函数、Date 等特殊类型作为叶节点终止,避免映射展开破坏签名或无限递归 ✓ 正确答案 B 函数类型应被递归展开为属性映射 C 所有对象都应按属性递归 D Promise 不需要特殊处理
# 10. as const satisfies 在路由表/配置对象的联合工程价值(保留字面量 + 校验) A as const satisfies 组合会丢失字面量类型 B satisfies 会改变表达式的类型 C as const 保留字面量 + satisfies 校验形状,让路由表/配置对象成为类型单一数据源,新增条目自动派生进联合类型 ✓ 正确答案 D 该组合只能用于数组
# 11. Brand Type(Nominal Type)的类型模拟与类型安全的工程价值 A UserId 与 OrderId 可以直接互赋 B 品牌类型在运行时校验值 C Brand Type 用品牌标签模拟名义类型,结构相同但语义不同的值互不赋值,必须经工厂/守卫显式转换,零运行时开销 ✓ 正确答案 D 品牌标签可以用任意字符串伪造且无法约束
# 12. TypeScript Playground 在类型诊断与教学协作的应用 A TypeScript Playground 只能写简单类型 B Playground 支持版本与配置切换、类型可视化与链接分享,是复现类型问题与教学协作的高效工具 ✓ 正确答案 C Playground 无法查看编译产物 D Playground 不能切换 TS 版本
# 13. Type-Level Unit(在类型系统表达单位与单位运算) A 单位只能靠运行时检查 B 量纲指数不需要类型函数 C 单位运算无法用类型表达 D 通过 phantom 类型参数建模量纲,类型级加减乘除推导单位运算结果,可在编译期拦截单位混用 ✓ 正确答案
# 14. 严格模式家族(strictNullChecks、strictFunctionTypes、noImplicitAny、exactOptionalPropertyTypes)的逐项开启策略 A 严格模式应按成本排序逐项开启(noImplicitAny → strictNullChecks → strictFunctionTypes → exactOptionalPropertyTypes),配合目录覆盖与 lint 分区推进 ✓ 正确答案 B strictNullChecks 是所有选项中报错面最小的 C exactOptionalPropertyTypes 应先于 noImplicitAny 开启 D 开启 strict 后不需要处理存量错误
# 15. Equal<X, Y>/IsAny<T> 等类型测试 helpers(来自 expect-type 等库) A X extends Y 即可判断两类型相等 B Equal 与可赋值判断完全相同 C Equal<X, Y> 用泛型函数逆变技巧做严格相等判定,IsAny 用交叉分布技巧识别 any,是类型测试库的核心原语 ✓ 正确答案 D IsAny 无法识别 any
# 16. 类型编程实战与运行时方案(zod、io-ts、valibot) A zod 的 schema 与 TS 类型无关 B valibot 与 zod API 完全一致 C zod/io-ts/valibot 用一份 schema 同时提供运行时校验与 infer 类型,按体积/生态选型,类型编程负责形状、schema 负责边界校验 ✓ 正确答案 D schema 校验后仍需手动断言
# 17. 类型挑战(type-challenges)高频题目(Pick、Readonly、DeepReadonly) A Pick 的键约束与索引访问无关 B DeepReadonly 不需要递归终止条件 C 手写 Readonly 会递归冻结嵌套对象 D 手写 Pick 用 [P in K]: T[P] 映射且 K 需受 keyof T 约束 ✓ 正确答案
# 18. type TupleToObject<T> 与元组转对象在常量数组键的工程应用 A TupleToObject 用 [P in T[number]] 把元组元素映射为对象键 ✓ 正确答案 B 元组无法作为键的来源 C 该类型只能用于字符串元组 D T[number] 取的是元组长度
# 19. type First<T extends any[]> 等元组访问类型在数组工具函数的工程应用 A First 只能通过索引 T[0] 实现 B infer 无法提取元组首元素 C 空元组的 First 总是返回 undefined D First/Last/Pop/Length 等元组访问类型可用索引或 infer 实现,配合数组工具函数让返回类型随元组精确推导 ✓ 正确答案
# 20. type Length<T extends readonly any[]> 在元组长度推导的工程价值 A 数组的 length 与元组的 length 都是字面量类型 B 长度无法参与类型运算 C readonly 元组没有 length D 元组 T['length'] 推导为字面量数字,配合元组生成技巧可实现类型级长度约束与数字运算 ✓ 正确答案
# 21. type LookUp<U, T extends U['type']> 在判别联合筛选的工程应用 A 判别字段必须是 number 类型 B LookUp 会返回所有联合成员 C LookUp 按判别字段值筛选联合成员,未命中成员被剔除 ✓ 正确答案 D LookUp 与 Extract 完全相同
# 22. Template Literal Types 在 i18n key 与 CSS-in-JS 的工程价值 A 模板字面量类型无法约束 i18n key B 类名生成与类型无关 C t() 的 key 参数无法类型化 D 模板字面量类型把 i18n key 与 CSS-in-JS 类名的命名规范编码为类型,实现补全、校验与单一数据源联动 ✓ 正确答案
# 23. TypeScript Compiler API 的基本使用,ts.createProgram、TypeChecker 与 AST 遍历(visitor 模式)在代码生成中的应用 A Compiler API 只有语法解析没有类型信息 B TypeChecker 通过 getTypeAtLocation 查询位置的类型信息 ✓ 正确答案 C AST 修改不需要 factory D 代码生成无法读取类型信息
# 24. typescript-eslint 类型感知规则(parserOptions.project)的实现原理与 no-floating-promises/no-misused-promises 等规则的类型信息获取 A parser 不接触 TypeScript 编译器 B 类型感知规则不需要 tsconfig 配置 C 类型感知规则通过 parserServices.program 获取 TypeChecker 并查询类型信息 ✓ 正确答案 D 类型感知 lint 没有性能代价
# 25. ts-morph 的 Project/SourceFile/API 在代码迁移工具(codemod)中的工程价值与 Compiler API 的封装差异 A ts-morph 与 Compiler API 功能完全一致 B ts-morph 在 Compiler API 之上提供声明式对象模型,适合常规 codemod ✓ 正确答案 C ts-morph 无法格式化代码 D codemod 必须使用自定义 transformer
# 26. API Extractor 在库 API 变更治理中的应用,api-report、api-documenter 与 breaking change 检测 A api-report 生成 API 快照供 PR diff 审查变更 ✓ 正确答案 B API Extractor 只能生成文档 C breaking change 检测不需要对比历史 D api-documenter 分析运行时行为
# 27. 类型编程在 zod、tRPC、Elysia 等现代库中的类型驱动设计应用 A zod 的 infer 只能用于对象 B tRPC 客户端调用类型由服务端过程定义自动推导 ✓ 正确答案 C Elysia 路由参数无法类型化 D 类型驱动设计与类型编程无关
# 28. 跨站 iframe 在进程隔离下的内存与调度成本 A 跨站 iframe 因站点隔离独占进程,带来内存放大与 IPC 调度成本,应控制数量并用懒加载治理 ✓ 正确答案 B 跨站 iframe 与主页面共享渲染进程 C iframe 数量不影响内存 D 同站 iframe 也总是独立进程
# 29. ts-expect-error vs @ts-ignore 的语义边界与使用规范 A @ts-expect-error 在下一行无错误时会报未使用错误 ✓ 正确答案 B @ts-ignore 在错误修复后自动告警 C 两个指令完全等价 D @ts-expect-error 不能加注释
# 30. 类型层级解析(Type Hierarchy)的可视化与推断行为 A 类型层级中 unknown 在顶层、never 在底层,可赋值方向决定报错方向,any 是层级外的特殊存在 ✓ 正确答案 B never 是任何类型的超类型 C 联合类型的层级由最宽成员决定 D 类型层级与收窄无关
# 31. 复杂条件类型导致编译变慢或报错难读时的治理(拆中间类型、命名) A 报错信息无法优化 B 类型实例化没有成本 C 复杂条件类型拆为具名中间类型可提升可读性与可测试性 ✓ 正确答案 D 递归类型不需要治理
# 32. assertNever 与 exhaustiveness check 在联合类型分支穷尽的工程价值 A assertNever 在未穷尽分支时编译报错 ✓ 正确答案 B assertNever 运行时抛出错误但无编译期检查 C 穷尽检查与判别联合无关 D default 分支不需要处理
# 33. Type-level recursion 与 depth limit([T] extends [never] 终止) A [T] extends [never] 通过元组包装阻止联合分布,使终止条件作用于整个 T ✓ 正确答案 B T extends never 与 [T] extends [never] 完全等价 C 类型递归没有深度限制 D 裸类型参数不会触发分布
# 34. Template Literal Types 与运行时验证(zod/valibot) A 模板字面量类型在运行时校验字符串 B 正则校验无法类型化 C 运行时验证可以省略 D 模板字面量类型约束编译期模式、zod/valibot 负责运行时校验,通过 schema 先行 + infer 保持双层契约一致 ✓ 正确答案
# 35. 类型级 SQL Builder 在测试与 CI 的工程价值 A SQL 类型安全与 schema 无关 B 类型级 SQL Builder 在运行时解析 SQL C 动态拼接 SQL 也能获得类型保护 D 类型级 SQL Builder 在编译期校验表名、列名与值类型匹配 ✓ 正确答案
# 36. type Push<T extends any[], U> 在元组追加元素的类型工具实现 A Push<T, U> 用 [...T, U] 拼接实现元组追加 ✓ 正确答案 B 元组无法在类型层面追加元素 C rest 展开只能用于函数参数 D Push 会修改原元组
# 37. type Concat<T extends any[], U extends any[]> 在元组拼接的类型工具 A readonly 元组无法拼接 B Concat 会在运行时合并数组 C Concat 用 [...T, ...U] 在类型层面拼接元组 ✓ 正确答案 D 元组拼接只能用于字符串
# 38. type MyAwaited<T extends Promise<any>> 在 Promise 解包类型的工程应用 A 内置 Awaited 只能解一层 B MyAwaited 通过 infer 解包并递归处理嵌套 Promise ✓ 正确答案 C Promise 解包不需要递归 D thenable 不在解包范围内
# 39. type MyReturnType<T> 在函数返回类型推导的工程价值 A ReturnType 对泛型函数返回展开后的具体类型 B ReturnType 对重载函数取最后一个签名 ✓ 正确答案 C infer 无法提取返回值 D 非函数类型返回 any
# 40. type MyExclude<T, U> 与 type MyExtract<T, U> 在联合类型筛选的工程应用 A Extract 保留不匹配的成员 B 条件类型不会对联合成员逐个判断 C [T] 包装会增强分布 D MyExclude 通过裸类型参数触发分布,逐个剔除可赋给 U 的成员 ✓ 正确答案
# 41. type IsAny<T>、type IsUnknown<T> 在边界类型守卫的工程价值 A IsUnknown 不需要判断 IsAny B any 与 unknown 在类型测试中可以互换 C IsAny 利用 0 extends (1 & T) 识别 any ✓ 正确答案 D 宽松类型无法被检测
# 42. type Mutable<T> 与 type Required<T> 在可变性与必填性的类型工具 A Required 会把 undefined 从类型中移除 B Mutable<T> 是递归深度的 C Required<T> 用 -? 映射移除可选性 ✓ 正确答案 D 修饰符映射只能加不能减
# 43. type TupleToUnion<T extends readonly any[]> 在联合推导的工程实践 A 元组的元素必须是字符串 B as const 数组无法推导联合 C TupleToUnion 通过 T[number] 推导元素联合 ✓ 正确答案 D T[number] 返回的是元组长度
# 44. type Last<T extends any[]> 在元组最后元素的类型推导 A Last 用 [...infer _, infer L] 匹配尾元素 ✓ 正确答案 B Last 对空元组返回 undefined C 元组尾元素只能靠索引访问 D infer 无法匹配 rest 元组
# 45. type Pop<T extends any[]> 在元组移除末尾的类型工具 A 空元组 Pop 返回 undefined B Pop 会修改原元组 C Pop 通过 [...infer R, any] 匹配并返回前部元组 ✓ 正确答案 D 元组无法表示栈
# 46. type Shift<T extends any[]> 在元组移除首元素的类型工具 A Shift 修改运行时数组 B Shift 与 Pop 的实现完全相同 C 元组无法做队列建模 D Shift 用 [any, ...infer R] 匹配并返回剩余元组 ✓ 正确答案
# 47. 类型挑战中的 Pick<T, K> 与 Omit<T, K> 手写实现与内置工具类型的差异 A 映射类型会丢失可选性 B 内置 Omit 会保留被剔除的键 C 键重映射无法用于 Omit D 手写 Pick 用 [P in K]: T[P] 且 K 受 keyof T 约束 ✓ 正确答案
# 48. 递归类型(type Flatten<T>、type DeepReadonly<T>)在树形 JSON Schema 与 Redux 状态类型化的工程应用 A JSON Schema 无法用递归类型建模 B Flatten 只压平一层数组 C DeepReadonly 递归只读化状态树,配合 Redux 不可变契约编译期强制 ✓ 正确答案 D Redux 状态不需要只读类型
# 49. Brand Types(type UserId = string & { __brand: 'UserId' })在表单状态与领域模型的工程价值 A 品牌类型与普通 string 完全等价 B 品牌类型在运行时校验字符串内容 C 表单字段 key 不需要类型约束 D Brand Types 让同构不同义的 ID 在类型层互不赋值 ✓ 正确答案
# 50. 条件类型与 infer 在 Promise 解包、函数返回类型推断、数组元素类型提取的工程实践 A 数组元素提取必须用递归 B infer 只能用于一种结构 C 异步包装无法保留原签名 D 条件类型 + infer 可统一实现 Promise 解包、返回类型与数组元素提取 ✓ 正确答案
# 51. 类型编程在 RPC 客户端(tRPC、Hono Client) A Hono Client 无法类型化路径参数 B RPC 客户端类型需要手写重复声明 C tRPC 客户端调用签名由服务端过程定义自动推导 ✓ 正确答案 D 服务端类型与客户端无关
# 52. 类型级 Schema 校验(zod、valibot、typia) A valibot 与 zod 实现完全相同 B typia 通过编译期代码生成实现校验,运行时性能远高于解释型 ✓ 正确答案 C 运行时校验无法被代码生成替代 D typia 不需要类型标注
# 53. 类型级 Builder Pattern 在 type BuildRequest<T> 等链式调用类型推导的工程实践 A this 参数在运行时生效 B 链式方法返回类型不影响可用性 C 状态累积只能用联合类型 D Builder 链式 API 通过泛型状态累积与 this 参数约束实现"按序可用"的类型强制 ✓ 正确答案
# 54. 映射类型的键重映射(as clause, TS 4.1+)在事件总线类型与 Redux Action 的现代应用 A Redux Action 联合无法自动派生 B 键重映射只能改值不能改键 C 键重映射可用 as 子句把事件名派生成处理器名并联动载荷类型 ✓ 正确答案 D as never 会保留键
# 55. 自定义 transformer(before/after/afterDeclarations)与 ts-patch/ts-node 的编译时 AST 改写边界 A afterDeclarations 改写的是 JS 产物 B after transformer 的产物参与类型检查 C tsc 原生支持 tsconfig 配置 transformer D before transformer 在类型检查前运行,其产物参与检查 ✓ 正确答案
# 56. TSDoc/JSDoc 注释提取与 TypeChecker.getSignatureFromSymbol 在文档自动化中的工程应用 A TSDoc 与 JSDoc 语法完全兼容 B 文档生成无法读取注释 C getSignatureFromSymbol 提取函数/方法签名的参数与返回类型信息 ✓ 正确答案 D 签名提取不需要 TypeChecker
# 57. Declaration Merging 与 Module Augmentation 在扩展第三方库类型声明中的工程取舍 A 模块增强只能合并 interface 声明,扩展需集中组织并随库版本回归 ✓ 正确答案 B type 别名也可以被模块增强合并 C 全局扩展不影响命名空间 D 扩展文件不需要纳入类型入口
# 58. tsc --build 与 project references 在 monorepo 增量编译中的依赖图管理与缓存策略 A tsc --build 按 references 依赖图拓扑序增量构建,利用 .tsbuildinfo 缓存判断重建范围 ✓ 正确答案 B tsc --build 每次全量编译所有项目 C 缓存失效只与源文件修改有关 D 项目引用不支持并行
# 59. TypeScript Language Service Plugin 在 IDE 中提供自定义诊断与补全的工程边界 A LS 插件参与 tsc 命令行构建检查 B Language Service Plugin 通过重写 getSemanticDiagnostics 等钩子在 IDE 提供类型感知诊断与补全 ✓ 正确答案 C 插件无法访问 TypeChecker D LS 插件在独立进程运行