类型编程实战

共 59 题
#

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 插件在独立进程运行