TypeScript中传递类作为参数时如何获取返回的类属性
问题解决:TypeScript类作为参数传递时的类型不匹配问题
问题重现
以下是简化后的代码,调用Registration.register传入Company类时会触发类型错误,传入User类则正常:
User类定义
class User { name!: string static setName(_name: string) { const user = new User() user.name = _name return user } }
Company类定义
class Company { name!: string brand!: string = 'mtx' static setName(_name: string) { const company = new Company() company.name = _name return company } }
Registration类定义
class Registration { static register<K>(name: string, Model: K & { setName: (n:string) => K }): K { return Model.setName(name) } }
调用代码
let user = Registration.register('mamad', User) let company = Registration.register('mamad', Company) // 此处触发类型错误
错误原因
原代码中泛型K被TypeScript推断为类的构造函数类型(比如typeof Company),但Company.setName返回的是Company实例,构造函数类型和实例类型不兼容。User类没有额外实例属性,类型推断宽松未报错;Company存在brand属性,严格的类型检查触发了不匹配错误。
修复方案
调整泛型约束,让K直接对应实例类型,同时简化Model的类型定义,只要求其包含返回K类型的setName静态方法:
class Registration { static register<K>(name: string, Model: { setName: (n: string) => K }): K { return Model.setName(name) } }
如果需要更严谨地限定Model为类构造函数,可以定义专属类型:
type ModelWithSetName<T> = { setName: (name: string) => T } class Registration { static register<T>(name: string, Model: ModelWithSetName<T>): T { return Model.setName(name) } }
修改后,Registration.register可以正确推断User和Company的实例类型,调用时不再报错。
内容的提问来源于stack exchange,提问作者Ali Sattarzadeh
相关产品推荐
相关产品推荐

