TS2351:对于类型缺少调用或构造签名的表达式,不能使用“new”。猫鼬

时间:2017-02-19 15:31:13

标签: mongoose typescript-typings

不确定我做错了什么,但我有这个类/模块:

import * as Mongoose from 'mongoose';
import * as _ from 'lodash';
import * as Promise from 'bluebird';
import { db } from '../lib/database';

let mongoose = Mongoose;

mongoose.Promise = Promise;


export class BaseModel  {

    constructor(schemaObj: {}, modelName: string, statics?: {}) {
      let Schema = new mongoose.Schema(schemaObj)

      Schema.statics.list = function () {
        return this.find()
      }

      Schema.statics.save = function (dataObj) {
        return this.save(dataObj)
      }

      if (statics) {
        for (let key in statics) {
          Schema.statics[key] = statics[key];
        }
      }
      
      return mongoose.model(modelName, Schema);
    }
    
}

let schema = {
  title:  String,
}

let Message = new BaseModel(schema, 'message');

let j = new Message({title: 'Hello World'}).save().then(function (res) {
  console.log(res);
})

一切确实有效但TypeScript抱怨:

  

TS2351:对于类型缺少调用或构造签名的表达式,不能使用“new”。

我知道我错过了一些东西,但我无法弄清楚是什么。

2 个答案:

答案 0 :(得分:1)

我认为问题不在您的代码中,您使用的唯一new运算符是创建一个新的mongoose方案,它看起来正确。可能问题在于猫鼬类型。

当函数返回另一个函数而不是类实例(例如:https://github.com/Microsoft/TypeScript/issues/2081)时,通常会显示您提到的错误。

尝试将打字更新到最新版本或尝试将其降级到不同的较低版本。

(打字是如此神奇,在我们的项目中,我们有时需要修复一个特定的版本,因为即使是更新的路径版本也可能会破坏项目。)

答案 1 :(得分:1)

导入mongoose时尝试删除* as。所以它会成为 import Mongoose from 'mongoose';