首页 > 解决方案 > 如何为类型创建文字值?

问题描述

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为类,因为我从模板继承了此代码。)

标签: typescript

解决方案


简单的答案是不,对象文字不符合该类型。它不符合,因为对象文字只有该email字段。类型需要同时满足mongoose.Document有很多方法(包括increment你得到的错误)和你指定的所有字段都是必需的,所以即使我们只考虑那部分它仍然无法工作,因为它有字段familyNameotherNames缺失。

您可以采用Partial<T>这种类型,它允许我们指定该类型字段的任何子集:

type MemberModel = mongoose.Document & {
    familyName: string,
    otherNames: string,
    email: string
}

function f(m: Partial<MemberModel>): void { }

f({ email: "abc@gmail.com" }); 

例如,更正确的方法可能是阅读此处mongoose如何定义模式和类。您可能正在寻找类似的东西:

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" })); 

推荐阅读