我有一个带有Activiy Interface和Mongo Schema的模型,以及一个带有ID并将其记录下来的函数。然后在我的路线中,我要查询未定义externalId的给定客户的所有活动。使用返回的数组,我调用了模型中定义的函数,并将externalId作为参数传递。
但是TypeScript不断抛出:'number |类型的参数。“未定义”不能分配给“数字”类型的参数。“未定义”类型不能分配给“数字”类型。我已经尝试使用if语句检查if来包装调用externalId && typeof externalId === 'number'
,但是我无法使错误消失。
模型:
import { Schema, model, } from 'mongoose';
interface IActivity {
customer: string,
externalId?: number,
}
const activitySchema: Schema = new Schema({
Customer: {
type: String,
required: true,
minlength: 5,
maxlength: 50,
},
externalId: { type: Number, },
});
export function updateExternal(externalId: number): void {
console.log(externalId);
}
export const Activity = model<IActivityModel>('Activity', activitySchema);
路线:
const completeActivity = await Activity
.find({
'externalId': { '$ne': undefined, },
'customer': 'Foo Customer',
});
completeActivity.forEach((activity) => {
updateExternal(activity.externalId); // This is where the error appears
});
有趣的是,当密钥可能实际上没有值时,为了获得密钥的值而应该发生什么。activity.externalId
有类型,number | undefined
那么我们要怎么做才能从number | undefined
移到number
?
我们需要“删除”的类型,就是说的一部分,我们需要提供一些方法来全部转换undefined
部分number | undefined
来number
。
通常,我们通过提供一些默认值来做到这一点-我们说,只要值是undefined
,就不要使用它-请改用默认值。但是,使用打字稿很难为此找到合适的类型。我们无法指定对象的类型具有我们要寻找的属性;因此,我们必须简单地说,它可以是any
,因此,该函数只能返回any
,例如:
interface IX {
a?: number;
}
function propOr<K extends string | number, U, O extends Record<K, U>>(k: K, defaultValue: U, obj: O) {
return obj[k];
}
const testFunction1 = (x: IX) => x.a; // has type number | undefined
const testFunction2 = (x: IX) => propOr('a', -1, x); // type error:
我们在这里得到的类型错误是:
类型'IX'的参数不能分配给类型'Record <“ a”,number>'的参数。属性“ a”的类型不兼容。输入'number | 未定义”不能分配给“数字”类型。类型'undefined'不能分配给类型'number'。(2345)
我们可能会看看其他库,看看它们在做什么,例如,Sanctuary的库为:
prop(p: string): (q: any) => any;
因此,在键入函数时,我们会有些卡住,被迫丢失类型信息(除非其他人可以提出更好的主意)。
我能想到的最好的解决方案是只使用一个或总是得到一个数字:
interface IX {
a?: number;
}
const a: IX = {};
const b = a.a || 0;
现在b
具有类型number
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句