我是 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;
}
}
为什么我的第二种方法为UserDocument和UserModel不工作,但同样的方法似乎对process.envand有效JwtPayload。