打字稿:'number | undefined'不能分配给类型为 'number' 的参数



我有一个带有Activiy接口和Mongo模式的模型,以及一个获取ID并记录它的函数。 然后,在我的路由中,我正在查询来自给定客户的所有活动,其中外部 ID 不是未定义的。使用返回的数组,我调用模型中定义的函数,将 externalId 作为参数传递。

但是 TypeScript 不断抛出:类型为 'number | undefined' 的参数不能分配给类型为 'number' 的参数。类型"未定义"不能分配给类型"数字"。 我已经尝试用 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.externalIdnumber | undefined型,那么我们应该怎么做才能从number | undefined转移到number

我们需要"删除"该类型的该部分,也就是说,我们需要提供某种方法来将number | undefined的所有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"的参数不能分配给类型为"记录<"a",编号>"的参数。 属性"a"的类型不兼容。 键入"数字 |未定义"不能分配给类型"数字"。 类型"未定义"不能分配给类型"数字"。(2345(

我们可以看看其他图书馆,看看他们做了什么,例如Sanctuary,它有:

prop(p: string): (q: any) => any;

因此,在键入函数时,我们有点卡住了,我们被迫丢失类型信息(除非其他人可以提出更好的想法(。

我能想到的最好的解决方案是只使用 or 总是得到一个数字:

interface IX {
a?: number;
}
const a: IX = {};
const b = a.a || 0;

现在b具有类型number.

相关内容

最新更新