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

为何TypeScript中Partial与extends未按预期工作?

为什么这段TypeScript代码无法正常运行?

先看报错的代码:

type FooData = {
  p: string;
}
const foo = <T extends FooData>() => {
  const not_working: Partial<T> = { p: "foo" }; // 此处报错:Type '{ p: "foo"; }' is not assignable to type 'Partial<T>'.(2322)
}

你以为T extends FooData能保证T的p是string类型,所以{ p: "foo" }应该能赋值给Partial<T>,但问题出在泛型T可以是FooData的更具体子类型。

举个实际的例子,如果调用foo时指定T为一个更严格的类型:

type StrictFoo = { p: "bar" };
foo<StrictFoo>();

这时候Partial<T>的类型会变成{ p?: "bar" | undefined },而你赋值的{ p: "foo" }里的p是字符串字面量"foo",和"bar"类型完全不兼容。TypeScript编译器必须确保代码在所有符合T extends FooData的场景下都合法,显然存在不合法的情况,所以报错。

如果要让代码合法,有两种常见方式:

  • 把Partial<T>改成Partial<FooData>,直接约束为基础类型的部分类型
  • 使用类型断言const not_working = { p: "foo" } as Partial<T>,但要注意这种方式会跳过类型检查,若T的p是更窄的类型,可能带来运行时风险

内容的提问来源于stack exchange,提问作者ilbrando

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:27:03