代码之家  ›  专栏  ›  技术社区  ›  Leon Gaban

函数缺少结束返回语句,返回类型不包括“undefined”

  •  0
  • Leon Gaban  · 技术社区  · 7 年前

    函数缺少结束返回语句,返回类型不包含“undefined”。

    在下面的异步等待函数中,我的返回类型是 Promise: <any> 但我想纠正这一点,所以我做了以下几点:

    export const getMarkets = async (): Promise<IGetMarketsRes> => {
      try {
        const nomicsUSD = prepHeaders('USD');
        const marketUSD = await nomicsUSD.get(exchangeMarketPrices);
        const nomicsUSDC = prepHeaders('USDC');
        const marketUSDC = await nomicsUSDC.get(exchangeMarketPrices);
        const nomicsUSDT = prepHeaders('USDT');
        const marketUSDT = await nomicsUSDT.get(exchangeMarketPrices);
    
        console.log('marketUSD', marketUSD);
    
        return {
          marketUSD: marketUSD.data,
          marketUSDC: marketUSDC.data,
          marketUSDT: marketUSDT.data
        }
      } catch (err) {
        console.error(err);
      }
    }
    

    然而,这就产生了上述错误。

    enter image description here

    哪里 getMarkets 被称为:

    export const fetchMarketPrices = (asset: string) => (dispatch: any) => {
      dispatch(actionGetMarketPrices);
      return getMarkets().then((res) => {
        const { marketUSD, marketUSDC, marketUSDT } = res;
        const combinedExchanges = marketUSD.concat(marketUSDC).concat(marketUSDT);
        const exchangesForAsset = combinedExchanges.filter((marketAsset: IMarketAsset) =>
          marketAsset.base === asset);
        return dispatch(actionSetMarketPrices(exchangesForAsset));
      });
    }
    

    适合的类型是什么 Promise<> 语法?


    我也尝试了这个方法,我希望这是正确的方法,但是没有得到Promise的返回,但是这是一个异步等待函数,这就是为什么返回在 try 声明:

    export const getMarkets = async (): Promise<IGetMarketsRes> => {

    enter image description here

    0 回复  |  直到 7 年前
        1
  •  9
  •   Nojze    5 年前

    更好的解决方案是在catch上抛出一个错误,而不是取消定义返回类型。未定义的类型删除了使用TypeScript的全部意义,否则。。。

    尝试以下解决方案:

    export const getMarkets = async (): Promise<IGetMarketsRes> => {
      
      try {
    
         // Your code :)
    
      } catch (err) {
        // More code here but the important thing here is to:
    
        // Throw error here
        throw(err)
      }
    }
    
        2
  •  7
  •   Leon Gaban    7 年前

    保持试捕的解决方案

    export const getMarkets = async (): Promise<IGetMarketsRes | undefined> => {
      try {
        const nomicsUSD = prepHeaders('111');
        const marketUSD = await nomicsUSD.get(exchangeMarketPrices);
        const nomicsUSDC = prepHeaders('222');
        const marketUSDC = await nomicsUSDC.get(exchangeMarketPrices);
        const nomicsUSDT = prepHeaders('333');
        const marketUSDT = await nomicsUSDT.get(exchangeMarketPrices);
    
        const { data: dataUSD } = marketUSD;
        const { data: dataUSDC } = marketUSDC;
        const { data: dataUSDT } = marketUSDT;
    
        if (R.isEmpty(dataUSD) || R.isEmpty(dataUSDC) || R.isEmpty(dataUSDT)) {
          console.error('Market data unavailable');
        }
    
        return {
          marketUSD: marketUSD.data,
          marketUSDC: marketUSDC.data,
          marketUSDT: marketUSDT.data
        }
      } catch (error) {
        console.error(error);
      }
    }
    

    一个更好的例子

    https://codereview.stackexchange.com/questions/213909/get-an-array-of-currency-exchange-prices-based-on-asset

    export const fetchMarket = async (currency: string): Promise<any> => {
      try {
        const request = prepHeaders(currency);
        const response =  await request.get(EXCHANGE_MARKET_PRICES);
        if (!response) {
          throw new Error('USD Markets unavailable.');
        }
        return response.data;
      }
      catch(err) {
        console.error(err);
      }
    }
    
    // GET Market prices
    // http://docs.nomics.com/#operation/getMarkets
    export const getMarkets = async (): Promise<IGetMarketsRes | undefined> => {
      try {
        const markets: IMarketRes = {};
    
        for (let currency of BASE_CURRENCIES) {
          const key = 'market' + currency;
          markets[key] = await fetchMarket(currency);
        }
    
        return {
          marketUSD: markets['marketUSD'],
          marketUSDC: markets['marketUSDC'],
          marketUSDT: markets['marketUSDT'],
        }
      } catch (error) {
        console.error(error);
      }
    }
    

    以及来自actions文件的调用:

    // Fetch USD, USDC & USDT markets to filter out Exchange List.
    export const fetchMarketPrices = (asset: string) => (dispatch: any) => {
      dispatch(actionGetMarketPrices);
      return getMarkets().then((res) => {
        if (res) {
          const exchangesForAsset = combineExchangeData(asset, res);
          return dispatch(actionSetMarketPrices(exchangesForAsset));
        }
      });
    }
    
        3
  •  2
  •   Benny Code    5 年前

    如果出现错误,代码将隐式返回 undefined 因为你抓住了 error 而不是重复。

    我猜你的 tsconfig.json 文件 noImplicitReturns 开始 true .如果你改成 false ,编译器错误将不再显示。然而,我建议保持 无mplicitreturns 开始 符合事实的 然后把错误重新扔到你的 catch 条款

    还可以返回默认值 IGetMarketsRes 接住 如果它与您的应用程序逻辑一起工作,则阻止它。我制作了一段视频,向您展示了处理错误TS2366的不同可能性: https://www.youtube.com/watch?v=8N_P-l5Kukk&t=363s

    推荐文章