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

如何在类类型参数中声明泛型以兼容ValueAccessor实现?

解决TypeScript泛型接口继承的编译错误

错误原因

你遇到的Generic type 'ValueAccessor<TValue>' requires 1 type argument(s)错误,是因为ValueAccessor是泛型接口,在定义TAccessor extends ValueAccessor时没有为它指定类型参数,TypeScript无法确定TValue的具体类型,因此抛出编译错误。

解决方案

根据你希望callAccessor能接受任意ValueAccessor具体实现(无论TValue类型)的需求,最简洁且符合预期的写法是移除Caller类的泛型参数,直接在callAccessor方法上定义泛型:

interface ValueAccessor<TValue> {
  returnValue(): TValue;
}

class Caller {
  public callAccessor<TValue>(accessor: ValueAccessor<TValue>): TValue {
    return accessor.returnValue();
  }
}

用法示例

这个写法会自动根据传入的accessor实例推断TValue的类型,完美支持任意ValueAccessor的实现:

// 字符串类型的Accessor
const stringAccessor: ValueAccessor<string> = {
  returnValue: () => "Hello World"
};

// 数字类型的Accessor
const numberAccessor: ValueAccessor<number> = {
  returnValue: () => 42
};

const caller = new Caller();
const strResult = caller.callAccessor(stringAccessor); // 类型为string
const numResult = caller.callAccessor(numberAccessor); // 类型为number

额外说明

如果你确实需要保留Caller类的泛型参数(比如要绑定到特定的泛型实现类),可以通过指定TAccessor继承带通配符的ValueAccessor<any>,但这种写法会丢失部分类型推断能力,不如上面的方案实用:

interface ValueAccessor<TValue> {
  returnValue(): TValue;
}

class Caller<TAccessor extends ValueAccessor<any>> {
  public callAccessor<TValue>(accessor: TAccessor & ValueAccessor<TValue>): TValue {
    return accessor.returnValue();
  }
}

内容的提问来源于stack exchange,提问作者Friedrik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 12:35:31