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