如何使打字稿与promises一起使用?

时间:2016-05-02 23:24:24

标签: node.js mongoose typescript promise bluebird

所以,我在node / express / mongoose应用程序上使用typescript,我试图让我的代码类型检查没有错误。

我定义了这个猫鼬模型:

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的回调API而不是其承诺API

1 个答案:

答案 0 :(得分:1)

  

typescript将我的'getCityById'函数解析为返回Promise&lt; {}&gt;而不是应有的承诺。

这是因为多个返回路径。

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

具体而言Promise.reject是无类型的。

快速修复

断言:

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