如何在类类型参数中声明泛型以兼容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
相关产品推荐
相关产品推荐

