0

我正在创建我的用户架构,但在尝试为registrationStatusTimeStamps函数上的字段分配值时出现以下错误,@pre<save>ts一直说是of type never.

我已经尝试了一切,但我一直在抱怨 TS 并且该字段没有保存。我想我想要的输出显然是在一个对象中保存字段的时间

我错过了什么?

error TS2322: Type 'Date' is not assignable to type 'never'

所需的存储输出

{
    registrationStatusTimeStamps: {
        initial: 2018-10-18 14:29:07.000,
        personalDetails: 2018-10-18 14:29:07.000,
        selectBroker: 2018-10-18 14:29:07.000,
        appropriatenessQuestionnaire: 2018-10-18 14:29:07.000,
        documentCheck: 2018-10-18 14:29:07.000,
        completed: 2018-10-18 14:29:07.000
    }
}

编码

export enum RegistrationStatuses {
    initial = "initial",
    personalDetails = "personalDetails",
    selectBroker = "selectBroker",
    appropriatenessQuestionnaire = "appropriatenessQuestionnaire",
    documentCheck = "documentCheck",
    completed = "completed"
};

@pre<User>("save", function (next: HookNextFunction) {
    // Update registration timestamps
    if (this.isModified("registrationStatus")) {
        this.registrationStatusTimeStamps[this.registrationStatus] = new Date();
    }
    return next();
})
export class User extends Typegoose {
    @prop({
        required: true,
        default: RegistrationStatuses.initial
    })
    public registrationStatus: RegistrationStatuses;

    @prop({
        default: {},
        _id: false,
    })
    public registrationStatusTimeStamps: { [k in RegistrationStatuses]?: Date };
}
4

1 回答 1

0

我不知道您使用的是哪个版本的 typegoose,但如果它是 6.1.5,那么以下将起作用

(6.0.0 进行了大修)

// NodeJS: 12.13.0
// MongoDB: 4.2-bionic (Docker)
import { getModelForClass, pre, prop } from "@typegoose/typegoose"; // @typegoose/typegoose@6.1.5
import * as assert from "assert"; // node's assert
import * as mongoose from "mongoose"; // mongoose@5.7.12

export enum RegistrationStatuses {
    initial = "initial",
    personalDetails = "personalDetails",
    selectBroker = "selectBroker",
    appropriatenessQuestionnaire = "appropriatenessQuestionnaire",
    documentCheck = "documentCheck",
    completed = "completed"
}

@pre<User>("save", function () {
    // Update registration timestamps
    if (this.isModified("registrationStatus") || this.isNew) {
        this.registrationStatusTimeStamps[this.registrationStatus] = new Date();
    }
})
export class User {
    @prop({ required: true, default: RegistrationStatuses.initial })
    public registrationStatus!: RegistrationStatuses;

    @prop({
        default: {},
        _id: false
    })
    public registrationStatusTimeStamps!: { [k in RegistrationStatuses]?: Date };
}

const UserModel = getModelForClass(User);

(async () => {
    await mongoose.connect(`mongodb://localhost:27017/`, { useNewUrlParser: true, dbName: "verifyStackOverflow1", useCreateIndex: true, useUnifiedTopology: true });

    const user = new UserModel({});
    console.log("before save", user, user.isModified("registrationStatus"), user.isNew); // before save { registrationStatus: 'initial', _id: <SomeObjectId> } false true
    assert(user.registrationStatus === RegistrationStatuses.initial);
    assert(Object.keys(user.registrationStatusTimeStamps).length === 0);

    await user.save();
    console.log("after save", user); // after save { registrationStatus: 'initial', _id: <SomeObjectId>, registrationStatusTimeStamps: { initial: 2019-11-30T18:27:02.507Z }, __v: 0 }
    assert(user.registrationStatus === RegistrationStatuses.initial);
    assert(typeof user.registrationStatusTimeStamps === "object");
    assert(user.registrationStatusTimeStamps[RegistrationStatuses.initial] instanceof Date);

    await mongoose.disconnect(); // to not have it running infinitly
})();

于 2019-11-30T18:31:22.870 回答