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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:05:18