在组件级别使用 Typescript 初始化 redux 状态类型检查

Initializing redux state type checking with Typescript on component level

我使用 RTK Query 和 Typescript 编写 React Native 应用程序进行状态管理,我有一个主切片,它包含 3 个深度级别的公司对象本身和加载状态等其他内容。如果用户成功登录,我正在获取公司信息从远程并作为 currentCompany 分派到主切片存储。所以用户不能在没有公司的情况下使用应用程序。但是当我初始化 redux store.Initial 状态时:


interface MainSlice {
  loading: number;
  isLoggedIn: boolean;
  currentCompany: Company | undefined; 
#If I use only company here I have to give dummy company for initial state which is not good practice.
}


const initialState: MainSlice = {
  loading: 0,
  isLoggedIn: false,
  currentCompany: undefined, #As I mentioned I had to define current company as undefined. If a define a dummy Company here because of company type requires a lot attributes I don't want to do that.
};

当我像那样使用主切片时,我总是必须在组件级别检查公司是否未定义。所以这很累人。 Typescript error ss

有什么方法可以避免 Typescript 错误或正确的初始状态吗situation.I 想定义肯定存在的公司

有几件事可以提供帮助,不幸的是没有灵丹妙药。

  1. 首先,请使用currentCompany: Company | null;代替undefinednull 是正确的选择,如果某些东西是故意的、明确的空的或丢失的——这在你的情况下是正确的。您知道公司数据稍后会保存,但一开始并不存在。参见 What is the difference between null and undefined in JavaScript?

  2. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining and https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator 在使用 null/undefined 和回退值时很有用。示例:currentCompany?.id ?? 'fallback-id-here'

  3. 您可以在读取状态后进行类型断言: (currentCompany as Company).id

  4. 如果只有一个登录用户和一个公司,您可以将公司状态移动到它自己的切片并更好地为初始状态建模:

    • interface CompanySlice { id: number, name: string };
    • const companyInitialState: CompanySlice = { id: 0, name: '' }; - 使用具有相同数据类型的值,但允许您检测它是否为空或无效。在此示例中,id 需要大于 0, 但您始终可以访问它而不会在组件 中出现打字稿警告。将“虚拟”公司作为初始状态本身并没有错。您可以编写一个选择器来推断公司是否已保存:const hasCompany = state => state.company.id > 0.