【问题标题】:Reducing an interface in TypeScript减少 TypeScript 中的接口
【发布时间】:2016-09-13 04:16:30
【问题描述】:

我有一个猫鼬模型,其接口声明如下:

export interface IUserDocument extends mongoose.Document {
  surname: string;
  lastName: string;
}

export interface IUserModel extends mongoose.Model<IUserDocument> {
  myStaticMethodGoesHere(signature: string): void;
}

以及对应的猫鼬模式:

const UserSchema = new mongoose.Schema({
  surname: {type: String, required: true}, 
  lastname: {type: String, required: true},
})

现在我必须定义我的用户的结构已经 2 次(猫鼬模式和打字稿接口),这不是 DRY 并且不方便。不幸的是,如果我想使用 mongoose 的 lean 方法,我必须再定义一个接口:

export interface ILeanUserDocument {
  _id: mongoose.Types.ObjectId;
  __v: number;
  surname: string;
  lastName: string;
}

这很不方便并且容易出错。有没有办法让我的精益界面扩展(我不知道这里使用的动词)我的 IUserDocument 界面但从中删除东西?

【问题讨论】:

    标签: typescript mongoose


    【解决方案1】:

    扩展并不是向接口添加属性的唯一方法。我相信您可以使用type intersection 来实现您正在寻找的东西。请注意,在下面的示例中,所有名称只是我对合适的猜测,请随意选择您喜欢的任何名称。

    你可以定义接口

    export interface IUserProperties {
      surname: string;
      lastName: string;
    }
    
    export type IUserDocument = mongoose.Document & IUserProperties;
    

    然后是以后

    interface ILeanUserBase {
      _id: mongoose.Types.ObjectId;
      __v: number;
    }
    
    export type ILeanUserDocument = ILeanUserBase & IUserProperties;
    

    IUserProperties 的更改将反映在IUserModelIUserDocument

    【讨论】:

      猜你喜欢
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      相关资源
      最近更新 更多