我想創建一個可以回傳類似值的物件/列舉的幫助程式,這樣我們就不會重復模式:
enum ActionTypes {
Find,
Update,
Create
}
enum RequestTypes {
Request,
Success,
Failure
}
如果我在這里開始使用這個列舉,我需要一個可以將其轉換為以下內容的輔助方法:
const actions = createActions(ActionTypes);
// actions.Find.Request -> 'FindRequest'
// actions.Find.Success -> 'FindSuccess'
甚至不知道從哪里開始我是打字稿的新手
的完整預期輸出actions應為:
{
Find: {
Request: 'FindRequest',
Success: 'FindSuccess',
Failure: 'FindFailure'
},
Create: {
Request: 'CreateRequest',
Success: 'CreateSuccess',
Failure: 'CreateFailure'
},
Update: {
Request: 'UpdateRequest',
Success: 'UpdateSuccess',
Failure: 'UpdateFailure'
}
}
uj5u.com熱心網友回復:
您可以從Object.values方法中獲取列舉字串,然后根據需要進行迭代和連接。
enum ActionTypes {
Find,
Update,
Create
}
enum RequestTypes {
Request,
Success,
Failure
}
function createActions(actionTypes) {
let actionTypeStrings = Object.values(actionTypes).filter(e => typeof e == 'string');
let requestTypeStrings = Object.values(RequestTypes).filter(e => typeof e == 'string');
let actions = actionTypeStrings.reduce((a, c) => {
let anAction: any = {};
requestTypeStrings.forEach((e: any) => anAction[e] = c e)
a[c] = anAction;
return a;
}, < any > {})
return actions;
}
const actions = createActions(ActionTypes);
console.log(actions);
uj5u.com熱心網友回復:
這是你可以做的:
enum ActionTypes {
Find = 'Find',
Update = 'Update',
Create = 'Create'
}
enum RequestTypes {
Request = 'Request',
Success = 'Success',
Failure = 'Failure'
}
type combination = {
[k in ActionTypes]: {
[k1 in RequestTypes]: `${k}${k1}`
}
}
function createActions(): combination {
return Object.keys(ActionTypes).reduce((cum, k) => {
cum[k] = Object.keys(RequestTypes).reduce((cum1, k1) => {
cum1[k1] = `${k}${k1}`
return cum1;
}, {} as any)
return cum;
} , {} as any)
}
console.log(createActions().Create.Failure)
// CreateFailure
TS 游樂場:https : //tsplay.dev/WG6bkm
uj5u.com熱心網友回復:
寫了一個簡單的函式來做到這一點。
function mixEnumsToObject(e1: any, e2: any) {
const keys1: string[] = Object.keys(e1).filter((key) => isNaN(Number(key)));
const keys2: string[] = Object.keys(e2).filter((key) => isNaN(Number(key)));
const mixEnumMap = new Map();
keys1.forEach((key1) => {
const valueObject = new Map();
keys2.forEach((key2) => {
valueObject.set(key2, key1 key2);
});
mixEnumMap.set(key1, valueObject);
});
return mixEnumMap;
}
const mixedEnumObject = mixEnumsToObject(ActionTypes, RequestTypes);
console.log(mixedEnumObject);
uj5u.com熱心網友回復:
這是一個型別安全的函式式解決方案,它接受兩個字串列舉作為引數(因此您可以將其重用于其他情況):
TS 游樂場鏈接
type StringEnum = Record<string, string>;
type NestedCombinedStringEnum<
P extends StringEnum,
C extends StringEnum,
> = {
[KP in keyof P]: {
[KC in keyof C]: KP extends string ? KC extends string ? `${KP}${KC}` : never : never;
};
};
function nestAndCombineStringEnums <
P extends StringEnum,
C extends StringEnum,
>(enumParent: P, enumChild: C): NestedCombinedStringEnum<P, C> {
const result: any = {};
for (const keyP of Object.keys(enumParent)) {
result[keyP] = {};
for (const keyC of Object.keys(enumChild)) {
result[keyP][keyC] = `${keyP}${keyC}`;
}
}
return result;
}
// Use:
enum ActionType {
Find = 'Find',
Update = 'Update',
Create = 'Create',
}
enum RequestType {
Request = 'Request',
Success = 'Success',
Failure = 'Failure',
}
const actions = nestAndCombineStringEnums(ActionType, RequestType);
console.log(actions.Create.Success); // "CreateSuccess"
console.log(actions); // the expected result object in your question
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/372370.html
標籤:javascript 打字稿
上一篇:val.foreach到達key.length2位后就不是函式了(已解決)
下一篇:如何輸入來自服務器的不同資料
