如何编写打字稿方法来复制javascript方法

时间:2016-02-07 10:12:22

标签: javascript node.js typescript

我在javascript中有这个代码:

// find the user
  User.findOne({
    name: req.body.name
  }, function(err, user) {

    if (err) throw err;

    if (!user) {
      res.json({ success: false, message: 'Authentication failed. User not found.' });
    } else if (user) {

            //issue token
        }

    })

User.findOne为猫鼬而来。 但我想嘲笑那种方法,所以此时我不想与数据库交谈。 但是想要保持这样的逻辑,所以我需要编写自己的User.findOne打字稿模拟,所以行为相同。

这就是我到目前为止所得到的:

export class User { 

    constructor() { }

    public findOne(user: any, next:Function) {
        console.log(1); //getting there
        var fake = {name: "a", password: "p"};

        return fake;
    }
}

我正在导入我的代码

import {User} from '../mock/User'; 

     var login = {name: req.body.name, password: req.body.password} //fake   

     // find the user
      User.prototype.findOne({
        user: login
      }, function(err, user) {
      console.log(2); //not getting there when using my User.findOne from .ts
      ........
}

function(err, user)之后的代码却没有被执行。

你有任何想法如何解决这个问题吗?

更新 刚试过使用lambdas但问题仍然存在:

User.findOne({user: login}, (err, user) => {
   console.log("test"); //- this code inside function just not executed
})

2 个答案:

答案 0 :(得分:2)

如果希望直接从User类调用该方法而不是从实例调用,则需要将其声明为静态。

public static findOne(user: any, next:Function) {
        console.log(1); //getting there
        var fake = {name: "a", password: "p"};
        next(undefined,fake); //this will call the function you passed as lambda or regular function
}

这样你可以像这样调用这个方法。

User.findOne({},(error,result)=>{
   //using a lambda here to make sure you have no issues with 'this' but you can also pass a regular function object.
  console.log(result);
  console.log(error);
}

答案 1 :(得分:1)

尝试使用名为user.ts静态方法在名为User的{​​{1}}类中定义:

user.ts

findOne(err, user)

将其用作:

export class User {

  constructor(){}

  static findOne(query, user: Function) {
    // whatever
  }
}

除此之外,我发现一个非常有用的提示:使用typescript来定义回调的签名而不仅仅是import * as User from './path/user' User.findOne({...}, (err, user) => { // whatever }) ,定义你的cb的参数;例如:

user.ts

Function