Javascript 函数缺少结束返回语句,返回类型不包括';未定义';

Javascript 函数缺少结束返回语句,返回类型不包括';未定义';,javascript,reactjs,typescript,async-await,Javascript,Reactjs,Typescript,Async Await,函数缺少结束返回语句,返回类型不包括“undefined” 在下面的异步等待函数中,我的返回类型是Promise:解决方案以保持try-catch 更好的解决方案是在catch上抛出一个错误,而不是取消定义返回类型。未定义的类型删除了使用TypeScript的全部要点,否则 尝试以下解决方案: export const getMarkets=async():Promise=>{ 试一试{ //您的代码:) }捕捉(错误){ //这里有更多代码,但重要的是: //在这里抛出错误 投掷(错误) }

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

在下面的异步等待函数中,我的返回类型是
Promise:

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

尝试以下解决方案:

export const getMarkets=async():Promise=>{ 试一试{ //您的代码:) }捕捉(错误){ //这里有更多代码,但重要的是: //在这里抛出错误 投掷(错误) } }
如果发生错误,您的代码将隐式返回
未定义
,因为您捕获了
错误
,而无需重新调用它

我猜您的
tsconfig.json
文件将
noImplicitReturns
设置为
true
。如果将其更改为
false
,编译器错误将不再显示。但是,我建议将
noImplicitReturns
设置为
true
,并在
catch
子句中重新抛出错误


如果符合应用程序逻辑,还可以在
catch
块中返回默认的
IGetMarketsRes
。我制作了一个视频,向您展示了处理错误TS2366的不同可能性:

因此,在出现错误的情况下,函数将隐式返回
未定义的
。它会如何影响来电者?在控制台.log之后重新显示错误不是更好吗?这样,您也可以移动
返回
以退出
尝试{}catch{}
,这样TS就可以了then@skyboyer哦,是的,这个函数在没有
try catch
的情况下仍然可以工作,谢谢你的提示!如果你想发帖,请继续,我会接受的。否则,我将继续重构,然后发布我的固定解决方案:)或者,您可以声明一个返回类型
Promise
,但它看起来更像是您不想处理该函数中的错误。@Bergi您的解决方案允许我保留
try-catch
是否要发布答案?@LeonGaban它允许您保留
try
/
catch
,代价是必须在每个调用站点显式检查
未定义的
结果
getMarkets()
,这也不是一种好的风格。为什么重新显示错误不是公认的答案?如果输入
undefined
类型,则可以得到
TS7030:在某些情况下,并非所有代码路径都返回值。
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);
  }
}
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));
  });
}
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);
  }
}
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);
  }
}
// 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));
    }
  });
}