我有两个使用mongoose和typescript定义模式的问题。下面是我的代码:
import { Document, Schema, Model, model} from "mongoose";
export interface IApplication {
id: number;
name: string;
virtualProperty: string;
}
interface IApplicationModel extends Document, IApplication {} //Problem 1
let ApplicationSchema: Schema = new Schema({
id: { type: Number, required: true, index: true, unique: true},
name: { type: String, required: true, trim: true },
});
ApplicationSchema.virtual('virtualProperty').get(function () {
return `${this.id}-${this.name}/`; // Problem 2
});
export const IApplication: Model<IApplicationModel> = model<IApplicationModel>("Application", ApplicationSchema);
首先:
本行中的
interface IApplicationModel extends Document, IApplication {}
打字稿告诉我:
error TS2320: Interface 'IApplicationModel' cannot simultaneously extend types 'Document' and 'IApplication'. Named property 'id' of types 'Document' and 'IApplication' are not identical.
那么如何更改id
属性的定义呢?
virtualProperty
的getter):return `${this.id}-${this.name}/;//问题2
错误是:
error TS2683: 'this' implicitly has type 'any' because it does not have a type annotation.
如何定义this
的类型
发布于 2018-10-24 07:34:50
问题#1:由于IApplicationModel
扩展了Document
和IApplication
接口,这两个接口声明了不同类型的id
属性(分别为any
和number
),因此TypeScript不知道IApplicationModel
的id
属性应该是any
类型还是<代码>D9类型。您可以通过使用所需的类型重新声明IApplicationModel
中的id
属性来修复此问题。(为什么要声明一个单独的IApplication
接口,而不是只声明用所有属性扩展Document
的IApplicationModel
?)
问题#2:只需向函数声明this
特殊参数,如下所示。
import { Document, Schema, Model, model} from "mongoose";
export interface IApplication {
id: number;
name: string;
virtualProperty: string;
}
interface IApplicationModel extends Document, IApplication {
id: number;
}
let ApplicationSchema: Schema = new Schema({
id: { type: Number, required: true, index: true, unique: true},
name: { type: String, required: true, trim: true },
});
ApplicationSchema.virtual('virtualProperty').get(function (this: IApplicationModel) {
return `${this.id}-${this.name}/`;
});
export const IApplication: Model<IApplicationModel> = model<IApplicationModel>("Application", ApplicationSchema);
发布于 2021-09-08 16:15:55
对于问题2:只需将this
声明为any
:.get(function (this: any) {});
修复它
https://stackoverflow.com/questions/52947886
复制相似问题