带有 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&lt;IRoleDocument&gt;

问候

【问题讨论】:

【参考方案1】:

据我所知,从 typescript 中的交集/联合类型继承是不可能的。在猫鼬类型定义的情况下,mongoose.Model&lt;T&gt; 被声明为交集类型:

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路口类型。 我在 Google 上搜索了如何创建打字稿找到的静态方法,而我的写作方式就是答案……也许是一种过时的方式。我知道接口只能具有一种方法类型,但是如何告诉打字稿我的意思是什么?对于第二点,我不太确定......

以上是关于带有 typescript 和 mongoose 的静态方法会:“一个接口只能扩展一个类或另一个接口。”的主要内容,如果未能解决你的问题,请参考以下文章

如何创建 Mongoose Schema 并将默认设置为带有 typescript 的数组?

UserModel 不可分配给 Document | 类型的参数nulll [带有 Typescript 的猫鼬]

typescript 使用TypeScript和MongoDb的Mongoose示例

typescript 使用TypeScript和MongoDb的Mongoose示例

typescript 使用TypeScript和MongoDb的Mongoose示例

Mongoose 的 loadClass() 和 TypeScript