1

我是 typescript 的新手,希望能更好地理解为第三方模块提供的自定义类型和扩展类型。

例如,我正在使用 mongoose 开发快速服务器。以以下用户模型为例:

import { model, Schema } from 'mongoose';
import { UserDocument, UserModel } from '../types';

const userSchema = new Schema<UserDocument, UserModel>(
  {
    name: { type: String, required: true },
    email: { type: String, required: true, unique: true },
    passport: { type: String, required: true }
  },
  {
    timestamps: true;
  }
);

export default model('User', userModel)

在这个模型中,Schema 上的通用 Document 和 Model 类型被我在目录中定义的UserDocument和覆盖。UserModeltypes

// ./types/user.d.ts

import {Document, Model} from 'mongoose';

export interface UserDocument extends Document {
  name: string;
  email: string;
  password: string;
  createdAt: Date;
  updatedAt: Date;
}

export interface UserModel extends Model<UserDocument> {}

当我显式导入类型声明时,这很好用。

但是,当我尝试将 UserDocument 和 UserModel 类型作为 mongoose 的模块声明的一部分来实现时,我遇到了错误。

declare module 'mongoose' {
  interface UserDocument extends Document {
    // ...from above
  }

  interface UserModel extends Model<UserDocument> {}
}

然后,在user.model.ts,而不是从导入 UserDocument 和 UserModel ./types,我做import { model, Schema, UserDocument, UserSchema } from 'mongoose'

最初,这不会在 VSCode 中造成任何 IntelliSense 问题,但是当我尝试运行/编译 typescript 时会引发错误,即 UserDocument 和 UserModel 未从模块“mongoose”导出。

然而,类似于以下两个片段的内容可用于将我的环境变量添加到 jsonwebtoken 包中process.env并将我的其他属性添加到JwtPayloadjsonwebtoken 包中:

declare namespace NodeJS {
  interface ProcessEnv {
    NODE_ENV: string;
    PORT: string;
    DB_URI: string;
  }
}

declare module 'jsonwebtoken' {
  interface JwtPayload {
    role: string;
  }
}

为什么我的第二种方法为UserDocumentUserModel不工作,但同样的方法似乎对process.envand有效JwtPayload

4

0 回答 0