如何为类型创建文字值?

时间:2018-07-02 09:23:55

标签: typescript

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

1 个答案:

答案 0 :(得分:3)

简单的答案是“否”,对象文字不符合该类型。它不符合,因为对象文字只有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如何定义架构和类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" }));