如何编写接收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
相关产品推荐
相关产品推荐

