带有 typescript 和 mongoose 的静态方法会:“一个接口只能扩展一个类或另一个接口。”
Posted
技术标签:
【中文标题】带有 typescript 和 mongoose 的静态方法会:“一个接口只能扩展一个类或另一个接口。”【英文标题】:Static methods with typescript & mongoose does: "An interface may only extend a class or another interface." 【发布时间】:2016-12-27 19:39:58 【问题描述】:我尝试向我的模型添加一个静态方法,但如果我这样做了,我会收到此错误:An interface may only extend a class or another interface.
这是我的代码:
import * as mongoose from 'mongoose';
import IPermission from './IPermission';
export interface IRoleDocument extends mongoose.Document
name: string,
inherit_from:
type: mongoose.Schema.Types.ObjectId,
ref: 'Role'
,
permissions: Array<IPermission>
;
export interface IRole extends mongoose.Model<IRoleDocument>
;
错误来自export interface IRole extends mongoose.Model<IRoleDocument>
问候
【问题讨论】:
【参考方案1】:据我所知,从 typescript 中的交集/联合类型继承是不可能的。在猫鼬类型定义的情况下,mongoose.Model<T>
被声明为交集类型:
type ModelConstructor<T> = IModelConstructor<T> & events.EventEmitter;
有关如何在打字稿中使用猫鼬的示例,您可以查看topic on SA
但是您仍然可以使用交集而不是继承来获取所需的接口,如下所示:
interface IRoleDefinition
myExtraProperty: string;
type IRole = mongoose.Model<IRoleDocument> & IRoleDefinition;
更多关于交集类型与继承的信息:github
【讨论】:
我看了SA的帖子。但是没有静态方法的声明。如果我在您的示例中执行此操作,则会找到 IRoleDefinition 定义但不是静态的。并且 IRoleDocument 中的成员对于 TypeScript 不存在。 我不是猫鼬方面的专家。为了帮助您,我想澄清以下几点:1)接口不能同时声明静态方法和实例方法 - 通常使用两个单独的接口 2)不可能扩展 mongoose.Model以上是关于带有 typescript 和 mongoose 的静态方法会:“一个接口只能扩展一个类或另一个接口。”的主要内容,如果未能解决你的问题,请参考以下文章
如何创建 Mongoose Schema 并将默认设置为带有 typescript 的数组?
UserModel 不可分配给 Document | 类型的参数nulll [带有 Typescript 的猫鼬]
typescript 使用TypeScript和MongoDb的Mongoose示例
typescript 使用TypeScript和MongoDb的Mongoose示例