我正在使用Reaction-Redux和TypeScrip,但收到错误:

TS2339:类型{}上不存在属性消息

import type { RootState } from "../store.ts";
import { fetchBaseQuery } from '@reduxjs/toolkit/query'
import type {
  BaseQueryFn,
  FetchArgs,
  FetchBaseQueryError,
} from '@reduxjs/toolkit/query/react'
import { createApi } from "@reduxjs/toolkit/query/react";

const baseQuery = fetchBaseQuery({
    baseUrl: 'http://localhost:3500/api/v1/',
    credentials: 'include',
    prepareHeaders: (headers: Headers, { getState }) => {
        const token: string|null = (getState() as RootState).auth.token
        if (token) {
            headers.set("authorization", `Bearer ${token}`)
        }
        return headers
    }
});

const baseQueryWithReauth: BaseQueryFn<
    string | FetchArgs,
    unknown,
    FetchBaseQueryError
> = async (args, api, extraOptions) => {
    const result = await baseQuery(args, api, extraOptions)
    console.log(result?.data?.message.AT);
    return result
}

我怎样才能得到result.data.message.AT分而不会出错?

我从后端返回数据如下:

res.status(200)
  .send({
    success: true,
    message: { AT: accessToken } }
  );

推荐答案

在非错误响应中,data类型为any,参见fetchBaseQuery:

type FetchBaseQueryResult = Promise<
  | {
      data: any
      error?: undefined
      meta?: { request: Request; response: Response }
    }
  | {
      error: {
        status: number
        data: any
      }
      data?: undefined
      meta?: { request: Request; response: Response }
    }
>

您可以强制转换Response data属性.

示例:

type ResponseData = {
  success: boolean;
  message: {
    AT: string;
  };
}

...

const baseQueryWithReauth: BaseQueryFn<
  string | FetchArgs,
  unknown,
  FetchBaseQueryError
> = async (args, api, extraOptions) => {
  const result = await baseQuery(args, api, extraOptions);

  if (result.data) {
    const data = result.data as ResponseData;
    console.log(data.message.AT);
  }

  return result;
}

Typescript相关问答推荐

调用另一个函数的函数的Typescript类型,参数相同

类型断言添加到类型而不是替换

React router 6.22.3不只是在生产模式下显示,为什么?

泛型和数组:为什么我最终使用了`泛型T []`而不是`泛型T []`?<><>

动态调用类型化函数

对深度对象键/路径进行适当的智能感知和类型判断,作为函数参数,而不会触发递归类型限制器

缩小并集子键后重新构造类型

是否可以基于对象的S属性值[]约束对象的其他属性值用于类型化的对象数组?

在排版修饰器中推断方法响应类型

打字错误推断

类型脚本-在调用期间解析函数参数类型

使用ngfor循环时,数据未绑定到表

为什么在泛型方法中解析此promise 时会出现类型错误?

如何在Reaction 18、Reaction-Rout6中的导航栏中获取路由参数

如何在Angular /字体中访问API响应的子元素?

通过辅助函数获取嵌套属性时保留类型

递归类型名称

有没有办法从不同长度的元组的联合中提取带有类型的最后一个元素?

类型string不可分配给类型string| 联盟| 的'

req.files = 未定义(Multer、Express、Typescript)