TypeScript实现抽象类getPrice方法报ts2416错误如何解决?
错误原因
触发TS2416错误的核心原因是子类实现抽象方法的签名和基类的抽象方法定义不匹配:
- 基类
Exchange里声明的抽象方法getPrice()没有定义任何入参,TypeScript会隐式把这个方法的类型推导为() => any - 但两个子类
Binance、Bittrex里实现的getPrice都要求传入coin、stable_coin两个参数,实际方法类型是(coin: any, stable_coin: any) => any - TypeScript的类型系统要求子类重写/实现父类方法时,必须满足父类的类型约定,带额外必填参数的函数类型不能赋值给无参数的函数类型,因此直接抛出类型不兼容的报错。
修复方案
核心是对齐基类和子类的方法签名,在抽象类的抽象方法上明确定义入参类型、返回值类型,同时补全其他属性的类型,避免隐式any带来的类型问题。
修复后的可运行代码:
// 定义币种结构类型,消除隐式any interface Coin { symbol: string; } abstract class Exchange { // 给coins属性补全类型 public coins: Coin[] = []; // 抽象方法明确定义入参、返回值类型,和子类实现保持一致 abstract getPrice(coin: Coin, stable_coin: Coin): Promise<string>; } class Binance extends Exchange { override getPrice(coin: Coin, stable_coin: Coin): Promise<string> { return axios .get(`https://api.binance.com/api/v3/avgPrice?symbol=${coin.symbol}${stable_coin.symbol}`) .then(res => res.data.price); } } class Bittrex extends Exchange { override getPrice(coin: Coin, stable_coin: Coin): Promise<string> { return axios .get(`https://api.bittrex.com/api/v1.1/public/getticker?market=${stable_coin.symbol}-${coin.symbol}`) .then(res => res.data.result.Last); } }
补充说明:如果后续不同交易所子类的getPrice参数逻辑存在差异,不要强行在基类固定参数列表,需要根据业务实际调整抽象层设计,避免违反里氏替换原则。如果使用TS4.3+版本,给重写的方法加上override关键字可以获得更清晰的类型校验提示。
内容的提问来源于stack exchange,提问作者Amarjit Singh
相关产品推荐
相关产品推荐

