oop - Hur man använder abstrakt klass i TypeScript?


I följande kod får jag ett fel när jag försöker implementera den abstrakta metoden getPrice.

abstract class Exchange {
    public coins=[];
    abstract getPrice();
}
class Binance extends Exchange {
    getPrice(coin,stable_coin){
       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 {
    getPrice(coin,stable_coin){
        return  axios.get(`https://api.bittrex.com/api/v1.1/public/getticker?market=${stable_coin.symbol}-${coin.symbol}`).then(res=>res.data.result.Last);
     }
}

Jag får följande fel:

Egenskapen 'getPrice' i typen 'Binance' kan inte tilldelas samma egenskap i basklassen 'Exchange'. Typen '(coin: any, stable_coin: any) => any' kan inte tilldelas typen '() => any'.ts(2416)

Svar #1

Du måste också matcha parametrarna för den abstrakta metoden. Dina härledda klasser skickar argument som inte är definierade i basklassen.

abstract class Exchange {
    public coins=[];
    abstract getPrice(coin:any, stable_coin: any): any;
}
class Binance extends Exchange {
    getPrice(coin: any, stable_coin: any): any {
       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 {
    getPrice(coin: any, stable_coin: any): any {
        return  axios.get(`https://api.bittrex.com/api/v1.1/public/getticker?market=${stable_coin.symbol}-${coin.symbol}`).then(res=>res.data.result.Last);
     }
}

Svar #2

Detta är en vanlig förväntning vid klassarv: överskuggande metoder bör ha en kompatibel signatur med basklassen (super) metod.

Här skulle du kunna ha t.ex. abstract getPrice(coin: any, stable_coin: any) i din abstrakta klass.

Eller, beroende på om det är meningsfullt i ditt fall eller inte, låt de extra parametrarna i dina barnmetoder vara valfria.

Relaterade artiklar