Typescript希望未定义的作为参数传递

Typescript希望未定义的作为参数传递,typescript,redux,Typescript,Redux,Typescript:2.4.1 我正在尝试创建一个助手函数来生成redux操作创建者 我得到的是: interface IAction<T extends string, P = undefined> { type: T; payload: P; } function createAction<T extends string>(type: T): () => IAction<T, undefined>; function creat

Typescript:2.4.1

我正在尝试创建一个助手函数来生成redux操作创建者

我得到的是:

interface IAction<T extends string, P = undefined> {
    type: T;
    payload: P;
}

function createAction<T extends string>(type: T): () => IAction<T, undefined>;
function createAction<T extends string = '', U = undefined, V = {}>(type: T, actionCreator: (payload: U) => V): (payload: U) => IAction<T, V>;
function createAction<T extends string>(type: T, actionCreator?: (payload?: any) => any) {
    return (payload: any) => ({
        payload,
        type,
    });
}

enum ActionType {
    INCREMENT = 'COUNTER/INCREMENT',
    DECREMENT = 'COUNTER/DECREMENT',
    ASYNC_INCREMENT = 'COUNTER/ASYNC_INCREMENT',
}

const increment = createAction(ActionType.INCREMENT, () => ({ amount: 1 }));
const incrementBy = createAction(ActionType.INCREMENT, (amount: number) => amount);
尝试以调用
incrementBy
的相同方式调用它,例如
increment(42)
,我得到以下错误:

[ts] Argument of type '42' is not assignable to parameter of type 'undefined';
这是有效的:
增量(未定义)


有办法解决这个问题吗?

您只需创建另一个重载,它将返回一个没有参数的函数,而不是将
未定义的
作为唯一参数的函数

function createAction<T extends string>(type: T): () => IAction<T, undefined>;
function createAction<T extends string, V>(type: T, actionCreator: () => V): () => IAction<T, V>;
function createAction<T extends string, U, V>(type: T, actionCreator: (payload: U) => V): (payload: U) => IAction<T, V>;
function createAction<T extends string, U, V>(type: T, actionCreator?: (payload: U) => V): (payload: U) => IAction<T, V> {
    return (payload: any) => ({
        payload,
        type,
    });
}
函数createAction(类型:T):()=>iaAction;
函数createAction(类型:T,actionCreator:()=>V:()=>IAction;
函数createAction(类型:T,actionCreator:(有效载荷:U)=>V:(有效载荷:U)=>IAction;
函数createAction(类型:T,actionCreator?:(有效载荷:U)=>V:(有效载荷:U)=>IAction{
返回(有效载荷:任意)=>({
有效载荷,
类型,
});
}
但是,您的实现似乎对传递的函数没有任何作用。您可能希望这样做:

function createAction<T extends string>(type: T): () => IAction<T, undefined>;
function createAction<T extends string, V>(type: T, actionCreator: () => V): () => IAction<T, V>;
function createAction<T extends string, U, V>(type: T, actionCreator: (payload: U) => V): (payload: U) => IAction<T, V>;
function createAction<T extends string, U, V>(type: T, actionCreator?: (payload: U) => V): (payload: U) => IAction<T, V> {
    if (actionCreator) {
        return (payload: U) => ({
            payload: actionCreator(payload),
            type,
        });
    } else {
        return () => ({
            payload: undefined,
            type
        });
    }
}
函数createAction(类型:T):()=>iaAction;
函数createAction(类型:T,actionCreator:()=>V:()=>IAction;
函数createAction(类型:T,actionCreator:(有效载荷:U)=>V:(有效载荷:U)=>IAction;
函数createAction(类型:T,actionCreator?:(有效载荷:U)=>V:(有效载荷:U)=>IAction{
如果(actionCreator){
返回(有效载荷:U)=>({
有效载荷:actionCreator(有效载荷),
类型,
});
}否则{
return()=>({
有效载荷:未定义,
类型
});
}
}
function createAction<T extends string>(type: T): () => IAction<T, undefined>;
function createAction<T extends string, V>(type: T, actionCreator: () => V): () => IAction<T, V>;
function createAction<T extends string, U, V>(type: T, actionCreator: (payload: U) => V): (payload: U) => IAction<T, V>;
function createAction<T extends string, U, V>(type: T, actionCreator?: (payload: U) => V): (payload: U) => IAction<T, V> {
    if (actionCreator) {
        return (payload: U) => ({
            payload: actionCreator(payload),
            type,
        });
    } else {
        return () => ({
            payload: undefined,
            type
        });
    }
}