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
为类,因为我从模板继承了此代码。)
解决方案
简单的答案是不,对象文字不符合该类型。它不符合,因为对象文字只有该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
如何定义模式和类。您可能正在寻找类似的东西:
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" }));
推荐阅读
- postgresql - 我在哪里可以获得 PostgreSQL 的 ispell 字典?
- python - 自定义 Logger 类 python:如何使其跨类工作?
- sql - 如何在以下上下文中根据开始日期和结束日期提取所有记录?
- matlab - MATLAB:在多维数组上循环时的空白图
- error-handling - 管理具有依赖关系的多个 pod 的健康状况
- algorithm - 给定多个数字列表,找到最接近特定数字的总和
- arrays - 如何创建特定长度的数组?
- android - Activity 更改时停止 ViewPager 重新加载
- scala - 为什么它不解码为 ADT 类型?
- mysql - 将大型 CSV 文件导入 MySQL 时出错