簡體   English   中英

TypeScript:'編號| undefined' 不可分配給“number”類型的參數

[英]TypeScript: 'number | undefined' is not assignable to parameter of type 'number'

我有一個帶有 Activiy 接口和 Mongo Schema 的 model 和一個帶有 ID 並記錄它的 function。 然后在我的路線中,我查詢來自未定義 externalId 的給定客戶的所有活動。 使用返回的數組,我稱之為 model 中定義的 function,將 externalId 作為參數傳遞。

但是 TypeScript 一直在拋出:'number | 類型的參數 undefined' 不能分配給“number”類型的參數。 類型“未定義”不可分配給類型“數字”。 我已經嘗試使用 if 語句來包裝調用,檢查 if externalId && typeof externalId === 'number' ,但我無法消除錯誤 go 。

Model:

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

我們需要“移除”該類型的那一部分,也就是說,我們需要提供一些方法來轉換number | undefined的所有undefined部分。 number | undefinednumber

通常我們通過提供一些默認值來做到這一點——我們說每當一個值是undefined時,不要使用它——使用默認值來代替。 不過,使用 typescript 很難找到一個好的類型; 我們無法指定 object 的類型具有我們正在尋找的屬性; 所以我們必須簡單地說它可以是any ,因此,function 只能返回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”的類型不兼容。 輸入'號碼 | undefined' 不可分配給類型 'number'。 類型“未定義”不可分配給類型“數字”。(2345)

我們可能會查看其他庫,看看它們做了什么,例如,Sanctuary 有它:

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

因此,當輸入 function 時,我們有點卡住了,我們被迫丟失了類型信息(除非其他人可以提出更好的想法)。

我能想到的最好的解決方案是只使用 or 總是得到一個數字:

interface IX {
    a?: number;
}

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

現在b具有類型number

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM