Typescript希望未定义的作为参数传递
Typescript:2.4.1 我正在尝试创建一个助手函数来生成redux操作创建者 我得到的是: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
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
});
}
}