TypeScript为何无法在条件分支中推断泛型对象属性类型?
TypeScript泛型类型窄化问题
我尝试在TypeScript中编写类型安全函数,但在窄化对象属性类型时遇到了类型推断问题。以下是最简错误示例:
type Language = "TYPESCRIPT" | "PYTHON"; type Code<T extends Language> = { lang: T; content: string }; function typecheck<T extends Language>(code: Code<T>) { if (code.lang === "TYPESCRIPT") { typecheckTS(code); // 错误:类型'Code<T>'无法赋值给'Code<"TYPESCRIPT">' } else { // ... } } function typecheckTS(code: Code<"TYPESCRIPT">) { // ... }
TypeScript报错信息:
Argument of type 'Code
' is not assignable to parameter of type 'Code<"TYPESCRIPT">'
当我使用infer关键字的条件类型重新定义Code类型时,TypeScript能正确处理类型推断,但这个方案不够直观:
type Language = "TYPESCRIPT" | "PYTHON"; type Code<T extends Language> = T extends infer T_ ? { lang: T_; content: string } : never; function typecheck<T extends Language>(code: Code<T>) { if (code.lang === "TYPESCRIPT") { typecheckTS(code); // 正常工作 } else { // ... } } function typecheckTS(code: Code<"TYPESCRIPT">) { // ... }
约束条件:
Code必须保持为泛型类型,typecheck()必须是泛型函数。- 避免显式类型转换,让TypeScript自动处理类型推断。
请问是否有更直观的解决方案满足这些约束?
内容的提问来源于stack exchange,提问作者mxgr
相关产品推荐
相关产品推荐

