使用Typescript和Mongodb时,如何定义文档的接口?

时间:2016-05-11 09:11:39

标签: mongodb typescript

考虑一个简单的用户集合:

// db.ts
export interface User {
      _id: mongodb.ObjectId;
      username: string;
      password: string;
      somethingElse: string;
}

// user.ts
import {User} from "../db"
router.get("/:id", async (req, res) => {
    const id = req.params.id;
    // user._id is a mongodb.Object.
    const user: User = await db.getUser(id);

    res.send(user);
});

// index.ts
// code that will runs on browser
import {User} from "../../db"
$.get('/user/...').done((user: User) => {
    // user._id is string.
    console.log(user._id);
});

它完美无缺,直到我想在客户端代码中使用此接口。因为用户的_id在从服务器传输为json时变为十六进制字符串。如果我将_id设置为mongodb.ObjectId | string,则行为会变得非常糟糕。 enter image description here

2 个答案:

答案 0 :(得分:3)

您可以尝试以聪明的方式将它们分开:

interface User {
   username: string;
   password: string;
   somethingElse: string;
}

export interface UserJSON extends User {
   _id : string
}

export interface UserDB extends User {
   _id : mongodb.ObjectId
}

以后再使用UserJSON(客户端)或UserDB(服务器端)。

答案 1 :(得分:1)

感谢@drinchev。我已经找到了一种更好的方法,使用泛型:

interface User<IdType> {
    _id: IdType;
    username: string;
    posts: Post<IdType>[];
}

interface Post<IdType> {
    _id: IdType;
    text: string;
}

export type UserDB = User<mongodb.ObjectID>;