如何检查泛型K是否为泛型M的一部分。打字稿通用 Redux

无符号的心

你好

我正在尝试减少React应用程序中的Bolilderplate。我正在使用Redux状态,并已决定要使用哪种Redux结构(请参见Context)。现在我想缩小它。为此,我创建了一个通用的actionCreator。我的问题是找到所需的通用语法。

通用动作创作者

这是我对动作生成器的通用方法。

export class genericAction<M, K> extends Action {
    public reducer = (state: M) => ({ ...state, ...this.payload });

    constructor(public readonly type: string | undefined, public payload: K) {
        super();
    }
}

目前,只能合并状态,但我的目标是作为函数的可选参数。然后,该功能将允许我执行自定义状态合并(例如state.count +有效负载)。但这是一个不同的话题。

问题

我的问题是我可以使用{ fubar: number}代替{ loading: boolean }显然,fubar不是我的ProductStateModel的一部分。

const someAction = new genericAction<ProductStateModel, { loading: boolean }>(ProductListActionTypes.REQUEST_START, { loading: true });

我只想将ProductStateModel的属性用作通用K的类型。伪代码:

genericAction<M, K is type of M> extends Action

总体思路是使用以下类型和参数创建操作:

  • 状态模型
  • ProductListActionType
  • 有效载荷

那可能吗?还是有通用/替代解决方案?如果需要,我可以更改StateModel。我是redux的新手,想做正确的事。我试图在通用方法中获取Pick <T,K>,但是现在我不确定这是否可以满足我的需要,或者我应该睡觉:D

感谢您的提示和帮助


语境

这是我的出发点

// State
export interface State {}

export interface ProductStateModel extends State {
    products: Array<ProductDTO>;
    loading: boolean;
    error: string;
}


// Product Actions
export abstract class Action {
    public readonly type: string | undefined;
    protected constructor() {
        return Object.assign({}, this);
    }
    abstract reducer(state: State): State;
}

// First of 3 Actions. They are all very similar. The generic function should replace all of them.
export class ProductListRequest extends Action {
    public readonly type = ProductListActionTypes.REQUEST_START;
    public reducer = (state: ProductStateModel) => ({ ...state, loading: this.payload.loading });

    constructor(public payload: Pick<ProductStateModel, 'loading'>) {
        super();
    }
}

// Reducer
export const productListReducer = (state: ProductStateModel = defaultProductState, action: Action) => {
    return isNil(action.reducer) ? action.reducer(state) : state;
};
无符号的心
export class genericAction<M> extends Action {
    public reducer = (state: M) => ({ ...state, ...this.payload });

    constructor(public readonly type: string | undefined, public payload: Partial<M>) {
        super();
    }
}

我删除了第二种类型,并将Partial添加到有效负载泛型类型。在我的脑海里,我想像在原始方法中那样限制允许的属性,Pick<ProductStateModel, 'loading'>但是后来我意识到这不是必需的。通用类的新调用是我定义此操作需要哪些属性的唯一地方,这很好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档