我正在使用React Redux的useSelector(state => state.SLICE_NAME)钩子,但是我很难定义state参数.它默认设置为unknown,所以当我试图返回state.SLICE_NAME(Error: Object is of type 'unknown')时会出现错误.

如何定义state类型,而不必手动创建单独的状态类型,并在创建时添加每个新的状态定义?

我试着将州定义为typeof store,但这不起作用.

一些代码可以帮助解释:

// navDrawer.ts

import { createSlice } from "redux-starter-kit";

// navDrawer initial state
export interface NavDrawerInitialState {
  open: boolean;
}

const navDrawerInitialState: NavDrawerInitialState = {
  open: false
};

// Create state slice
const { actions, reducer } = createSlice({
  slice: "navDrawer",
  initialState: navDrawerInitialState,
  reducers: {
    open: (state: NavDrawerInitialState) => {
      state.open = true;
    },
    close: (state: NavDrawerInitialState) => {
      state.open = false;
    }
  }
});

export const navDrawerActions = actions;
export default reducer;
// reducers.ts

import navDrawer from "./navDrawer";

const reducers = {
  navDrawer
};

export default reducers;
// store.ts

import { configureStore } from "redux-starter-kit";
import reducer from "./reducers";

const store = configureStore({
  reducer
});

export default store;
// Page.tsx

import React, { FC } from "react";
import { Provider } from "react-redux";
import store from "./store";
import ChildComponent from "./ChildComponent";

const StateProvider: FC = () => {
  return <Provider store={store}><ChildComponent /></Provider>;
};

export default StateProvider;
// ChildComponent.tsx

import React, { FC } from "react";
import { useSelector } from "react-redux";

const ChildComponent: FC = () => {
  const navDrawerState = useSelector(state => state.navDrawer); // ERROR OCCURS HERE. "state" is defined as 'unknown' so "state.navDrawer" throws an error.
  return <div>Text</div>
}

Edit:我注意到configureStore()的类型定义包含state作为第一个泛型类型.见下面的截图.如果我能从EnhancedStore中得到第一个通用值,那么我就能用它来定义状态.有没有办法用打字脚本来做这个?

enter image description here

推荐答案

这可能不是答案,但我是这样使用的:

const isLoggedIn = useSelector<IRootState, boolean>(state => state.user.loggedIn);

编辑:或使用更短/更干净的Peter's answer

const isLoggedIn = useSelector((state: IRootState) => state.user.loggedIn);

Typescript相关问答推荐

物料UI图表仅在悬停后加载行

在TypScript手册中可以视为接口类型是什么意思?

Angular 过滤器形式基于某些条件的数组控制

使用Angular和API请求在CRUD操作后更新客户端数据的良好实践

需要使用相同组件重新加载路由变更数据—React TSX

如何在第一次加载组件时加载ref数组

在NextJS中获得Spotify Oauth,但不工作'

被推断为原始类型的交集的扩充类型的交集

TypeScrip省略了类型参数,仅当传递另一个前面的类型参数时才采用默认类型

在列表的指令中使用intersectionObservable隐藏按钮

如何正确调用创建的类型?

->;Boolean类型的键不能分配给类型Never

将对象的属性转换为正确类型和位置的函数参数

是否可以通过映射类型将函数参数约束为预定义类型?

如何扩展RxJS?

如何键入对象转换器

如何以类型安全的方式指定键的常量列表,并从该列表派生所挑选的接口?

Karma Angular Unit测试如何创建未解析的promise并在单个测试中解决它,以判断当时的代码是否只在解决后运行

如何将 MUI 主题对象的自定义属性与情感样式组件中的自定义props 一起使用?

元素隐式具有any类型,因为string类型的表达式不能用于索引类型{Categories: Element;管理员:元素; }'