假設有一個函式回傳以下物件。
private static prepareExperienceFilter(experienceLevel: ExperienceFilterType): any {
const aggregationObject = {
'lt_1': { $lt: 1 },
'between_1_3': { $gt: 0, $lt: 3 },
'between_3_5': { $gt: 2, $lte: 5 },
'gt_5': { $gt: 5 }
};
const condition = aggregationObject[experienceLevel];
return { 'yearsOfExperience.min': condition };
}
我們如何為此類物件定義型別或介面?
我嘗試過聯合型別,但沒有成功。
謝謝你的幫助。
uj5u.com熱心網友回復:
通過將靜態物件移到方法之外,您可以在函式的回傳型別中參考其型別。這將允許您使用泛型型別引數來約束函式引數(同時還為使用它的開發人員提供 IntelliSense 推理)并索引回傳型別:
TS游樂場
const aggregationObject = {
'lt_1': { $lt: 1 },
'between_1_3': { $gt: 0, $lt: 3 },
'between_3_5': { $gt: 2, $lte: 5 },
'gt_5': { $gt: 5 },
};
type ExperienceFilterType = keyof typeof aggregationObject;
function prepareExperienceFilter <T extends ExperienceFilterType>(experienceLevel: T): {
'yearsOfExperience.min': typeof aggregationObject[T];
} {
const condition = aggregationObject[experienceLevel];
return { 'yearsOfExperience.min': condition };
}
const result_lt_1 = prepareExperienceFilter('lt_1'); // { 'yearsOfExperience.min': { $lt: number; }; }
const result_gt_5 = prepareExperienceFilter('gt_5'); // { 'yearsOfExperience.min': { $gt: number; }; }
const result_invalid = prepareExperienceFilter('another_key'); /*
~~~~~~~~~~~~~
Argument of type '"another_key"' is not assignable to parameter of type '"lt_1" | "between_1_3" | "between_3_5" | "gt_5"'.(2345) */
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/442523.html
標籤:javascript 打字稿
