【问题标题】:Sharing typescript interfaces between client and server mongoose model在客户端和服务器猫鼬模型之间共享 typescript 接口
【发布时间】:2017-06-14 00:49:24
【问题描述】:

我正在尝试在客户端代码和服务器代码之间共享一些基本接口。我在使用接口在 mongoose 中创建数据模型时遇到问题。

我遇到的问题是如何访问客户端中的 document._id 属性。我无法将 _id 添加到用户界面而不会导致编译错误,并且我无法访问 _id 而不声明它。

我的项目布局:

/src
-/client
--/user.service.ts
-/server
--/models
---/user.model.ts
-/common
--/common.d.ts

user.service.ts

import { User } from 'common'

 deleteUser(user: User): Promise<User> {
   return this.http.delete( 'http://someurl/api/users' + user._id )
     .toPromise()
     .then( resp => resp.json().data as User )
     .catch( err => this.errorHandler(err) );
 }

user.model.ts

import { model, Schema, Document } from 'mongoose';
import { User } from 'common';

let UserSchema = new Schema {
  firstName: String,
  lastName: String,
  email: String
}

export interface UserDocument extends User, Document { }

export var UserModel:Model<UserDocument> = model<UserDocument>('Users', UserSchema);

common.d.ts

declare module 'common' {
  export interface User {
    firstName: string;
    lastName: string;
    email: string;
  }
}

感谢您的帮助

【问题讨论】:

    标签: node.js mongodb angular typescript mongoose


    【解决方案1】:

    您可以将_id 声明为可选:

    export interface User {
        _id?: string;
        firstName: string;
        lastName: string;
        email: string;
    }
    

    或者您可以为具有 id 的用户提供另一个界面:

    export interface PersistedUser extends User {
        _id: string;
    }
    

    并在需要时投射到它。

    【讨论】:

    • 您好,感谢您的帮助。前段时间我尝试了 optional ,但得到 error TS2320: Interface 'UserDocument' cannot simultaneously extend types 'User' and 'Document'. Named property '_id' of types 'User' and 'Document' are not identical. 扩展接口可以工作,希望有更好的方法,我觉得随着项目变得越来越大,我会感到困惑,我需要更多接口来支持更多持久化对象。跨度>
    • 我已经按照建议实现了扩展接口,它正在工作。谢谢
    • 从 Typescript 2.1 开始,他们也为一些类似的情况添加了 Partial 类型 typescriptlang.org/docs/handbook/release-notes/…
    • @forrestranger Partial&lt;User&gt; 将使User 的所有属性都是可选的,OP 只希望_id 是可选的。
    • 是的,我明白了。这就是为什么我在评论中说与此类似的情况而不是答案。当我们向遗留代码添加类型并迁移到更好的 API 时,它一直出现在我们的代码中。不过感谢您指定,这可能会让未来的读者感到困惑。
    猜你喜欢
    • 1970-01-01
    • 2021-03-10
    • 2012-11-01
    • 1970-01-01
    • 2016-12-04
    • 2013-02-17
    • 2021-10-23
    • 2020-05-16
    相关资源
    最近更新 更多