如何使承诺的打字稿工作?

所以,我在节点/ express / mongoose应用程序上使用打字稿,我试图让我的代码typecheck没有错误。

我定义这个mongoose模型:

import * as mongoose from 'mongoose'; const City = new mongoose.Schema({ name: String }); interface ICity extends mongoose.Document { name: string } export default mongoose.model<ICity>('City', City); 

和这个控制器:

 import * as Promise from 'bluebird'; import CityModel from '../models/city'; export type City = { name: string, id: string }; export function getCityById(id : string) : Promise<City>{ return CityModel.findById(id).lean().exec() .then((city) => { if (!city) { return Promise.reject('No Cities found with given ID'); } else { return { name: city.name, id: String(city._id) }; } }); } 

问题是,出于某种原因,打字稿解决了我的'getCityById'函数返回一个Promise<{}>而不是一个Promise<City>因为它应该。

失败的尝试:

  • 我试图在Promise.resolve包装返回对象
  • 我试图使用new Promise并依靠mongoose的callbackAPI,而不是他们的诺言API

打字机解决我的'getCityById'函数返回一个Promise <{}>,而不是一个承诺,因为它应该。

这是因为有多个返回path。

 if (!city) { return Promise.reject('No Cities found with given ID'); } else { return { name: city.name, id: String(city._id) }; } 

具体Promise.reject是无types的。

快速解决

断言:

 if (!city) { return Promise.reject('No Cities found with given ID') as Promise<any>; } else { return { name: city.name, id: String(city._id) }; }