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
相关产品推荐
相关产品推荐

