其他
TypeScript 类型错误排查与 any 消除:用泛型…
当需要解决 TypeScript 类型错误、消除 any、设计复杂泛型或实现严格类型时使用
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 47/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 50/100 ×0.15
适用场景
TypeScript 类型错误排查与 a通用
解决思路
- 运行 `tsc --noEmit` 捕获完整的错误输出,然后再进行修改
- 识别类型问题的根本原因(不健全的推断、缺失的约束、隐式 `any` 等)
- 使用高级 TypeScript 特性构建精确、类型安全的解决方案
- 消除所有 `any` 类型并替换为正确的类型——验证每个替换仍然满足调用点
- 再次运行 `tsc --noEmit` 确认修复后能干净编译
- 运用高级泛型和条件类型
- 运用模板字面量类型和映射类型
- 运用工具类型和类型操作
- 运用品牌类型和名义类型
- 运用复杂推断模式
- 运用型变(variance)和分发(distribution)规则
- 运用模块增强和声明合并
- 针对每个 TypeScript 挑战:解释问题背后的类型理论
- 在适用时提供多种解决方案
- 展示修改前后的类型表示
- 包含全面的类型测试
- 确保完整的 IntelliSense 支持
- 消除 any 时使用泛型:将 `function getProperty(obj: any, key: string): any` 改写为 `function getProperty<T, K extends keyof T>(obj: T, key: K): T[K]`,使 `getProperty({ name: "Alice" }, "name")` 推断为 string
- 收窄 unknown API 响应:定义 `interface User { id: number; name: string }`,编写类型守卫 `function isUser(value: unknown): value is User`,将 `fetchUser` 返回类型改为 `Promise<User>`,把 `res.json()` 结果标注为 `unknown`,用 `if (!isUser(data)) throw new Error("Invalid user shape")` 校验后返回
- 参考 rules/as-const-typeof.md:使用 `as const` 和 `typeof` 从运行时值推导类型
- 参考 rules/array-index-access.md:使用 `[number]` 索引访问数组元素类型
- 参考 rules/utility-types.md:使用内置工具类型 Parameters、ReturnType、Awaited、Omit、Partial、Record
- 参考 rules/generics-basics.md:泛型类型、约束和推断的基础
- 参考 rules/builder-pattern.md:使用可链式方法的类型安全构建器模式
- 参考 rules/deep-inference.md:使用 F.Narrow 和 const 类型参数实现深度类型推断
- 参考 rules/conditional-types.md:用于类型级 if/else 逻辑的条件类型
- 参考 rules/infer-keyword.md:在条件类型中使用 `infer` 提取类型
- 参考 rules/template-literal-types.md:在类型层面进行字符串操作
- 参考 rules/mapped-types.md:通过转换现有类型属性创建新类型
- 参考 rules/opaque-types.md:用于类型安全标识符的品牌类型和不透明类型
- 参考 rules/type-narrowing.md:通过控制流分析收窄类型
- 参考 rules/function-overloads.md:为复杂函数签名使用函数重载
- 参考 rules/error-diagnosis.md:诊断和理解 TypeScript 类型错误的策略