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

TypeScript泛型问题:实现Model子类转Entity并保留泛型类型

保留泛型的Model转Entity方法实现

首先是基类定义:

interface Entity {}
interface Model {
  toEntity(): Entity;
}

需求是写一个接收Model派生类实例的方法,转换为Entity同时保留泛型类型,原写法如下:

function convert<T extends Model, J extends T['toEntity']>(model: T) { 
  return model.toEntity();
}

这段代码会抛出错误:

类型“Entity”无法分配给类型“J”。J可能被实例化为任意与Entity无关的类型

问题原因

你定义的泛型J约束的是T['toEntity']——也就是方法本身的类型,而不是方法的返回值类型。TypeScript无法确认这个J和toEntity()返回的Entity有什么关联,所以报错。

正确实现方式

方式一:自动推导返回值类型

直接用ReturnType工具类型获取toEntity的返回类型,让TypeScript自动推导具体的Entity子类型:

function convert<T extends Model>(model: T): ReturnType<T['toEntity']> {
  return model.toEntity() as ReturnType<T['toEntity']>;
}

方式二:显式绑定返回值泛型

如果需要更清晰地指定返回类型,可以把泛型参数绑定到Entity的子类型上:

function convert<E extends Entity, T extends Model & { toEntity(): E }>(model: T): E {
  return model.toEntity();
}

验证示例

定义具体的Entity和Model派生类,测试泛型是否保留:

interface UserEntity extends Entity {
  id: number;
  name: string;
}

interface UserModel extends Model {
  toEntity(): UserEntity;
}

const userModel: UserModel = {
  toEntity() {
    return { id: 1, name: '张三' };
  }
};

const userEntity = convert(userModel);
// userEntity的类型自动识别为UserEntity,完整保留了具体类型信息

内容的提问来源于stack exchange,提问作者pepsi-maniac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 08:45:35