![](/img/trans.png)
[英]Type 'false' is not assignable to type '((status: number) => boolean) | undefined' TypeScript
[英]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 | undefined
為number
。
通常我們通過提供一些默認值來做到這一點——我們說每當一個值是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.