如何在 redux-toolkit 中正确使用元类型的 PayloadAction?
How to properly use PayloadAction with meta type in redux-toolkit?
简化示例
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
type Cake = {
flavor: string;
size: 'S' | 'M' | 'L';
};
const initialState: { all: Cake[]; meta: { currentPage: number } } = {
all: [],
meta: {
currentPage: 0,
},
};
const cakeSlice = createSlice({
name: 'cake',
initialState,
reducers: {
fetchAll(
state,
action: PayloadAction<Cake[], string, { currentPage: number }>,
) {
state.all = action.payload;
state.meta = action.meta;
},
},
});
export default cakeSlice;
我遇到了这些错误。
Type '
(state: {
all: {
flavor: string;size: "S" | "M" | "L";
} [];meta: {
currentPage: number;
};
}, action: PayloadAction < Cake[], string, {
currentPage: number;
}, never > ) => void ' is not assignable to type '
CaseReducer < {
all: Cake[];meta: {
currentPage: number;
};
}, {
payload: any;type: string;
} > | CaseReducerWithPrepare < {
all: Cake[];meta: {
currentPage: number;
};
}, {
payload: any;type: string;
} > '
Type '
(state: {
all: {
flavor: string;size: "S" | "M" | "L";
} [];meta: {
currentPage: number;
};
}, action: PayloadAction < Cake[], string, {
currentPage: number;
}, never > ) => void '
is not assignable to type 'CaseReducer<{ all: Cake[]; meta: { currentPage: number; }; }, { payload: any; type: string; }>'.
Types of parameters 'action'
and 'action'
are incompatible.
Type '{ payload: any; type: string; }'
is not assignable to type 'PayloadAction<Cake[], string, { currentPage: number; }, never>'.
Property 'meta'
is missing in type '{ payload: any; type: string; }'
but required in type '{ meta: { currentPage: number; }; }
'.
RTK 的默认行为是创建一个只有一个参数和有效负载的动作创建器 属性。 TS 注释无法修改此行为,因为 TS 注释对运行时行为没有影响。
您可以使用 the prepare
notation 来定义覆盖此默认行为的函数。
此函数与 prepare
argument for createAction 具有相同的签名和行为,因此您可以在那里找到大部分相关文档。
在您的具体情况下,您需要符合
的内容
const cakeSlice = createSlice({
name: 'cake',
initialState,
reducers: {
fetchAll: {
reducer(
state,
action: PayloadAction<Cake[], string, { currentPage: number }>
) {
state.all = action.payload
state.meta = action.meta
},
prepare(payload: Cake[], currentPage: number) {
return { payload, meta: { currentPage } }
}
}
}
})
简化示例
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
type Cake = {
flavor: string;
size: 'S' | 'M' | 'L';
};
const initialState: { all: Cake[]; meta: { currentPage: number } } = {
all: [],
meta: {
currentPage: 0,
},
};
const cakeSlice = createSlice({
name: 'cake',
initialState,
reducers: {
fetchAll(
state,
action: PayloadAction<Cake[], string, { currentPage: number }>,
) {
state.all = action.payload;
state.meta = action.meta;
},
},
});
export default cakeSlice;
我遇到了这些错误。
Type '
(state: {
all: {
flavor: string;size: "S" | "M" | "L";
} [];meta: {
currentPage: number;
};
}, action: PayloadAction < Cake[], string, {
currentPage: number;
}, never > ) => void ' is not assignable to type '
CaseReducer < {
all: Cake[];meta: {
currentPage: number;
};
}, {
payload: any;type: string;
} > | CaseReducerWithPrepare < {
all: Cake[];meta: {
currentPage: number;
};
}, {
payload: any;type: string;
} > '
Type '
(state: {
all: {
flavor: string;size: "S" | "M" | "L";
} [];meta: {
currentPage: number;
};
}, action: PayloadAction < Cake[], string, {
currentPage: number;
}, never > ) => void '
is not assignable to type 'CaseReducer<{ all: Cake[]; meta: { currentPage: number; }; }, { payload: any; type: string; }>'.
Types of parameters 'action'
and 'action'
are incompatible.
Type '{ payload: any; type: string; }'
is not assignable to type 'PayloadAction<Cake[], string, { currentPage: number; }, never>'.
Property 'meta'
is missing in type '{ payload: any; type: string; }'
but required in type '{ meta: { currentPage: number; }; }
'.
RTK 的默认行为是创建一个只有一个参数和有效负载的动作创建器 属性。 TS 注释无法修改此行为,因为 TS 注释对运行时行为没有影响。
您可以使用 the prepare
notation 来定义覆盖此默认行为的函数。
此函数与 prepare
argument for createAction 具有相同的签名和行为,因此您可以在那里找到大部分相关文档。
在您的具体情况下,您需要符合
的内容const cakeSlice = createSlice({
name: 'cake',
initialState,
reducers: {
fetchAll: {
reducer(
state,
action: PayloadAction<Cake[], string, { currentPage: number }>
) {
state.all = action.payload
state.meta = action.meta
},
prepare(payload: Cake[], currentPage: number) {
return { payload, meta: { currentPage } }
}
}
}
})