从https://stackoverflow.com/a/51132333/936293开始,为什么以下内容不起作用?
type MemberModel = mongoose.Document & {
familyName: string,
otherNames: string,
email: string
}
function f(m: MemberModel):void { }
f1( { email: "abc@gmail.com" });
最后一行导致编译器错误:
“ {{email:string; }”不可分配给“ MemberModel”类型的参数。输入'{email:string; }”不可分配给“文档”类型。 类型'{电子邮件:字符串;类型'中缺少属性'increment'。 }'。
{ email: "abc@gmail.com" }
是否不符合类型MemberModel
指定的形状?
在这种情况下,如何将合适的文字传递给f
? (这时我想避免将MemberModel
更改为类,因为我是从模板继承此代码的。)
答案 0 :(得分:3)
简单的答案是“否”,对象文字不符合该类型。它不符合,因为对象文字只有email
字段。该类型既要满足具有很多方法的mongoose.Document
(包括increment
这又是您得到的错误)的要求,也要满足您指定的所有字段的要求,因此即使我们考虑到这一点,部分仍然无法使用,因为缺少字段familyName
和otherNames
。
您可以输入Partial<T>
这种类型,它使我们可以指定该类型的字段的任何子集:
type MemberModel = mongoose.Document & {
familyName: string,
otherNames: string,
email: string
}
function f(m: Partial<MemberModel>): void { }
f({ email: "abc@gmail.com" });
例如,更正确的方法可能是通读mongoose
如何定义架构和类here。您可能正在寻找类似的东西:
type MemberModel = mongoose.Document & {
familyName: string,
otherNames: string,
email: string
}
var memberModelSchema = new mongoose.Schema({
familyName: String,
otherNames: String,
email: String
});
var MemberModel = mongoose.model<MemberModel>('MemberModel', memberModelSchema);
function f(m: MemberModel): void { }
f(new MemberModel({ email: "abc@gmail.com" }));