
redux 要求状态必须可序列化(即能被 json 安全表示),而 javascript 类实例因包含原型、方法和闭包等不可序列化内容,会触发警告;推荐统一使用 plain object(普通对象)替代类实例来建模状态。
redux 要求状态必须可序列化(即能被 json 安全表示),而 javascript 类实例因包含原型、方法和闭包等不可序列化内容,会触发警告;推荐统一使用 plain object(普通对象)替代类实例来建模状态。
在使用 Redux Toolkit(RTK)构建 React 应用时,一个常见误区是将业务逻辑中的类(如 User 或 Account)直接存入 Redux state。例如,当你定义:
export class User {
name: string;
email: string;
token: string;
constructor(name: string, email: string, token: string) {
this.name = name;
this.email = email;
this.token = token;
}
}并在 reducer 中执行 state.user = new User(...),Redux DevTools 和 RTK 的 serializability middleware 就会检测到该对象携带非序列化属性(如构造函数、原型链、潜在的 getter/setter 等),从而抛出类似以下警告:
A non-serializable value was detected in the state, in the path:
account.user
✅ 最佳实践:用 TypeScript 类型(type/interface)代替类(class)建模状态
Orderly React SDK 钩子使用参考指南,包括 useOrderEntry、usePositionStream、useOrderbookStream、useCollateral 等。
状态的本质是数据快照,而非行为载体。因此应改用类型别名或接口定义结构,并始终用 plain object 初始化和更新:
// ✅ 推荐:仅描述结构,无运行时开销
export type User = {
name: string;
email: string;
token: string;
};
export interface AccountState {
id: string;
user?: User; // 注意:仍是可选的 plain object
}
const initialState: AccountState = {
id: '',
};
const accountSlice = createSlice({
name: 'account',
initialState,
reducers: {
setAccount(state, action: PayloadAction<{ id: string; name: string; email: string; token: string }>) {
const { id, name, email, token } = action.payload;
state.id = id;
state.user = { name, email, token }; // ← 纯对象,完全可序列化
},
},
});⚠️ 注意事项:
- 不要混用
class实例与 Redux state —— 即使类中只有字段,其instanceof User检查、constructor属性及隐式原型链仍违反可序列化约束; - 若需复用业务逻辑(如
User.validate()或User.toDTO()),可将这些封装为纯函数(utility functions),而非绑定在类上; - 如确需在组件中使用类实例(例如调用
user.getDisplayName()),应在useSelector后按需从 state 中构造临时实例,绝不存入 store:
const userState = useSelector((s: RootState) => s.account.user); const user = userState ? new User(userState.name, userState.email, userState.token) : undefined;
? 进阶建议:对于复杂领域模型,可采用「状态层 + 领域层」分离设计:
- Redux store 仅保存最小化、扁平化、可序列化的数据(plain object / primitives);
- 领域逻辑(含验证、转换、派生计算)通过 selector 或自定义 hook 封装,保持 store 干净且可调试。
总之,拥抱不可变性与可序列化,是构建可预测、可调试、可持久化 Redux 应用的基石。

















