打字稿:猫鼬模式的静态方法

Posted

技术标签:

【中文标题】打字稿:猫鼬模式的静态方法【英文标题】:Typescript: static methods for mongoose schemas 【发布时间】:2016-08-28 15:59:35 【问题描述】:

我正在尝试使用 TypeScript 实现一个猫鼬模型,没什么特别的,只是尝试让它工作。此代码编译但带有警告:

import crypto = require('crypto')
import mongoose = require('mongoose')
mongoose.Promise = require('bluebird')
import Schema from 'mongoose'

const UserSchema = new Schema(
  name: String,
  email: 
    type: String,
    lowercase: true,
    required: true
  ,
  role: 
    type: String,
    default: 'user'
  ,
  password: 
    type: String,
    required: true
  ,
provider: String,
  salt: String
);

/**
 * Methods
 */
UserSchema.methods = 
  // my static methods... like makeSalt, etc
;

export default mongoose.model('User', UserSchema);

但是打字稿在抱怨:

error TS2339: Property 'methods' does not exist on type 'Schema'.

我想我需要扩展一些接口。有这个指针吗?

【问题讨论】:

【参考方案1】:

默认情况下,Schema 类型不允许扩展。在 typescript 中,接口是开放的并且是可扩展的。您需要扩展 Schema 的类型以包含您正在扩展的字段,否则 typescript 不知道它。这是扩展类型的一个很好的答案。 How do you explicitly set a new property on `window` in TypeScript?

如果您查看https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/mongoose/mongoose.d.ts,您会看到猫鼬的一般类型。

你最有可能做的是以下,虽然我不知道你是否可以扩展类:

schema-extended.d.ts

module "mongoose" 
   export class Schema 
       methods:any
   

然后在你的代码中:

///<reference path="./schema-extended.d.ts" />
//Schema should now have methods as a property.
new Schema().methods

【讨论】:

真的很好,除了如果我导入变量它不起作用。 import Schema from 'mongoose' 引发导入声明与本地声明的 'Schema' 冲突 您还必须扩展架构所属的模块,而不是直接创建架构。看看 Schema 的类型,你会看到它在哪个模块中。 我不确定我是否理解正确。你能详细说明一下吗?

以上是关于打字稿:猫鼬模式的静态方法的主要内容,如果未能解决你的问题,请参考以下文章

使用静态方法的打字稿继承

在nodejs和打字稿中使用变量到静态方法

使用猫鼬和打字稿创建模式

使用猫鼬和打字稿创建模式

使用猫鼬模型设置打字稿

如何使用打字稿定义猫鼬模式参考字段?