TypeScript:“数字| 未定义”不能分配给“数字”类型的参数

马特·S

我有一个带有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 | undefinednumber

通常,我们通过提供一些默认值来做到这一点-我们说,只要值是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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TS2345:“数字|数字”类型的参数 未定义”不能分配给“数字”类型的参数

TypeScript-输入'number | 未定义”不能分配给“数字”类型

“数字”类型的参数不能分配给自定义请求类型的参数

TypeScript - 类型未定义不能分配给类型 ICustomType

“数字”类型的参数不能分配给“字符串”类型的参数 - Typescript 和 Angular

类型'string |的Typescript错误参数 数字”不能分配给“从不”类型的参数

输入'string | 不能将null分配给类型'string | TypeScript未定义的错误

Typescript(类型'undefined'不能分配给类型)为什么我的数组有一个|号?未定义?

“数字”类型的参数不能分配给 angular2 中“字符串”类型的参数。

“数字”类型的参数不能分配给“字符串”类型的参数

'string | 类型的参数 number' 不能分配给类型为 'string' 的参数。“数字”类型不能分配给“字符串”类型

为什么“数字”类型不能分配给“ T”类型?

类型 'string' 不可分配给类型 'WebkitAppearance | 在 React + TypeScript 中未定义?

输入'string | 数字”不能分配给“从不”类型

不能使用 ParseInt 将“数字”类型的参数分配给“字符串”类型的参数

“数字”类型的参数不能分配给“字符串”类型的参数。将旧项目导入新项目时

“(旧:数字)=> void”类型的参数不可分配给“数字”类型的参数

Typescript Pick <>类型失败:类型'“ foo”'的参数不能分配给类型'Pick <Bar,“ foo”>'的参数

Typescript类型的React类型参数不能分配给类型参数

Typescript编译器永远不会错误:键入'string | 数字”不能分配给“从不”类型。类型“字符串”不可分配为类型“从不”

'{ keyPrefix: string; 类型的 ReactJS Typescript 参数 }' 不能分配给字符串类型的参数

Typescript React / Redux:类型'typeof MyClass'的参数不能分配给'ComponentType <...'类型的参数

TypeScript:类型'((错误:任何)=>无效'的参数不能分配给类型参数

typescript:类型“ any []”的参数不能分配给类型“ []”的参数。ts(2345)

Person 类型的 TypeScript 错误 (TS2345) 参数 | undefined 不能分配给 Person 类型的参数

Typescript枚举键入错误(类型'string'的参数不能分配给类型的参数)

React Typescript-类型的参数不能分配给类型的参数

React Typescript:类型'{[x:number]的参数:任意;}'不能分配给类型的参数

TypeScript-类型'String'的参数不能分配给类型'string'的参数