我有一個助手,我正在導出和導入多個文件,它工作正常,但是我想稍微改變它,我正在努力解決這個問題:
// utils.ts
export enum RequestTypes {
Request,
Success,
Failure,
}
type CombineEnums<P, C> = {
[KP in keyof P]: {
[KC in keyof C]: KP extends string ? KC extends string ? `${KP}${KC}` : never : never;
};
};
export function createActions <P, C>(actionTypes: P, requestTypes: C): CombineEnums<P, C> {
const result: any = {};
for (const keyP of Object.keys(actionTypes)) {
result[keyP] = {};
for (const keyC of Object.keys(requestTypes)) {
result[keyP][keyC] = `${keyP}${keyC}`;
}
}
return result;
}
現在在另一個文件中,我正在導入 createActions 方法和 RequestTypes 並像這樣使用它:
// module.ts
import { createActions, RequestTypes } from './utils.ts';
enum Actions {
Find,
Create
}
const actions = createActions(Actions, RequestTypes);
// actions.Find.Request -> 'FindRequest'
// actions.Find.Success -> 'FindSuccess'
// actions.Create.Failure -> 'CreateFailure'
這一切都很好,但是RequestTypes
很少會改變,我想讓它成為一個可選參數,但如果需要,仍然能夠通過其他 RequestTypes。
所以理想情況下,我想要上述解決方案,但用法是:
const actions = createActions(Actions)
具有相同的輸出。
如果需要,通過不同的請求類型:
enum TabRequests {
Open,
Close
}
enum TabActions {
Tab
}
const actions = createActions(TabActions, TabRequests);
// actions.Tab.Open -> 'TabOpen'
// actions.Tab.Close -> 'TabClose'
我已經嘗試了我能想到的一切,但似乎無法弄清楚打字稿的一面!
// signature for only one argument
export function createActions <P>(actionTypes: P): CombineEnums<P, typeof RequestTypes>;
// signature for two arguments
export function createActions <P, C>(actionTypes: P, requestTypes: C): CombineEnums<P, C>;
// actual implementation with default value for second argument
export function createActions <P>(actionTypes: P, requestTypes: any = RequestTypes): CombineEnums<P, any> {
const result: any = {};
for (const keyP of Object.keys(actionTypes)) {
result[keyP] = {};
for (const keyC of Object.keys(requestTypes)) {
result[keyP][keyC] = `${keyP}${keyC}`;
}
}
return result;
}
// If you want you could also use the following line as implementation signature
// export function createActions <P, C>(actionTypes: P, requestTypes: C | typeof RequestTypes = RequestTypes): CombineEnums<P, C | typeof RequestTypes> {
// Now you can use both signatures, typesafe.
const actionsWithRequestTypeArgument = createActions(Actions, RequestTypes);
const actionsWithoutRequestTypeArgument = createActions(Actions);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句