You need to enable JavaScript to run this app. 如何编写接收Partial<Class>类型参数的TypeScript类构造函数
优惠活动
大模型
产品
解决方案
定价
更多

如何编写接收Partial<Class>类型参数的TypeScript类构造函数

问题原因与修复方案

核心问题点

  • 属性存在性校验逻辑错误:key in User校验的是类的静态属性,你需要校验的是类实例属性,该判断逻辑永远不会命中你定义的username、passcode两个实例属性
  • 未处理Partial类型的空值风险:Partial<User>的所有属性都允许为undefined,但类实例属性要求是string/number类型,直接赋值会触发类型不匹配错误

最简实现

如果不需要过滤传入的undefined值,直接用Object.assign即可,TS原生支持该写法的类型校验:

type UserInterface = {
  username: string
  passcode: number;
}

class User implements UserInterface {
  username = 'Default username';
  passcode = 1234

  constructor(args: Partial<User>) {
    Object.assign(this, args);
  }
}

带属性校验+空值过滤的实现

如果需要严格校验仅能赋值类中已存在的属性,且过滤掉传入的undefined值避免覆盖默认值,可以用如下实现:

type UserInterface = {
  username: string
  passcode: number;
}

class User implements UserInterface {
  username = 'Default username';
  passcode = 1234

  constructor(args: Partial<User>) {
    for (const key in args) {
      // 仅处理类中已声明的实例属性,且传入值不为空的情况
      if (Object.prototype.hasOwnProperty.call(this, key) && args[key] !== undefined) {
        this[key as keyof User] = args[key] as NonNullable<User[keyof User]>;
      }
    }
  }
}

该实现会自动过滤掉不存在于类中的属性,符合你的校验要求,同时规避了undefined赋值的类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 09:15:10