You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:49:53