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

TypeScript泛型继承接口时Value not assignable to type 'Partial'错误如何解决?

报错原因

TypeScript 抛出这个报错是因为泛型 MoreValues extends UserValues 只约定了最低约束,并没有限定 MoreValues 不能收窄已有字段的类型。举个例子,开发者完全可以合法传入如下符合约束的泛型参数:

interface CustomUser extends UserValues {
  // 收窄了avatar的类型,不再是任意string
  avatar: "system-avatar" | "custom-avatar"
  extraField: number
}

这种情况下你传入固定字符串 'some-string' 就不符合 CustomUser 对 avatar 的类型要求,TypeScript 正是考虑到这种可能性,才会判定 {avatar:'some-string'} 不能直接赋值给 Partial<MoreValues>,因为 Partial<MoreValues> 的实际类型由使用者传入的泛型参数决定,不能在基类中提前预设固定值。


解决方案

你可以通过以下两种常用方案解决问题,同时保留泛型扩展能力:

方案1:安全类型断言(最便捷)

既然你明确业务逻辑中设置的 avatar 值永远符合所有可能的 MoreValues 对该字段的类型要求,可以直接通过类型断言告知 TS 类型合法:

class User<MoreValues extends UserValues = UserValues> extends Table<MoreValues>{
  constructor(values:MoreValues) {
    super(values);
    // 增加类型断言即可
    this.set({avatar:'some-string'} as Partial<MoreValues>);
  }
}

方案2:调整set方法类型约束(更安全)

如果希望避免无限制的类型断言,可以修改 Table 类的 set 方法类型,允许传入当前泛型父类约束的字段子集:

class Table<ValuesType extends DefaultTableValues = DefaultTableValues>{
  public values: ValuesType;
  constructor(initialValues:ValuesType) {
    this.values=initialValues;
  }
  // 调整参数类型,支持传入ValuesType以及所有父类的字段子集
  public set(newValues:Partial<ValuesType> | Partial<DefaultTableValues>){
    this.values={
      ...this.values,
      ...newValues
    } as ValuesType
  }
}
// 对应在User类中如果需要进一步增加支持的字段范围,可以重载set方法
class User<MoreValues extends UserValues = UserValues> extends Table<MoreValues>{
  public set(newValues: Partial<MoreValues> | Partial<UserValues>): void {
    super.set(newValues)
  }
  constructor(values:MoreValues) {
    super(values);
    // 不需要断言即可直接调用
    this.set({avatar:'some-string'});
  }
}

这个方案的好处是后续所有继承 User 的类都可以直接修改 UserValues 中定义的字段,不需要额外写断言,类型检查也更严格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:39:04