当前位置: 首页 > 知识库问答 >
问题:

TypeScriptError: Type'Data'不能分配给type'string'

韩高峯
2023-03-14

我正在为我的应用程序使用React-typescript。对于状态管理,我使用Redux工具包。我正在获取一个开放api并将其存储到我的redux存储库中。我创建了分派函数。当我点击dispatch函数时,它将显示随机狗图像。但问题是当我使用这个img src时,在映射之后。我收到typescript错误:类型“数据”不能分配给类型“字符串”。我不知道我做错了什么。我在codesandbox中上传了我的代码,虽然它在codesandbox中工作,但在我的应用程序中不工作。

另外,我没有上传我的商店设置代码,因为它可以找到☺️.

这是我的减速机

    /* eslint-disable @typescript-eslint/indent */
    import { createSlice, PayloadAction } from '@reduxjs/toolkit';
    import { AppThunk } from "store/store";
    
    interface IMeta {
      loading: boolean;
      error: boolean;
      message: string;
    }
    
    interface Data {
      src: string;  
    }
    
    interface IDogs {
      meta: IMeta;
      dogs: Data[];
    }
    
    const initialState: IDogs = {
      "meta": {
        "loading": false,
        "error": false,
        "message": ``
      },
      "dogs": []
    };
    
    const dogSlice = createSlice({
      "name": `random-dogs`,
      initialState,
      "reducers": {
        loadState(state) {
          state.meta = {
            "loading": true,
            "error": false,
            "message": ``
          };
          state.dogs = [];
        },
        fetchData(state, action: PayloadAction<Data[]>) {
          state.meta.loading = false;
          state.dogs = action.payload;
          console.log(`dogs`, action.payload);
        },
        loadFailed(state, action: PayloadAction<string>) {
          state.meta = {
            "loading": false,
            "error": true,
            "message": action.payload
          };
          state.dogs = [];
        }
      }
    
    });
    
    export const { loadState, fetchData, loadFailed } = dogSlice.actions;
    export default dogSlice.reducer;
    
    export const fetchDogs = (): AppThunk => async (dispatch) => {
      const url = `https://dog.ceo/api/breeds/image/random/5`;
    
      try {
        dispatch(loadState);
        const response = await fetch(url);
        const data = await response.json();
        console.log(data);
        console.log(data.message);
        const singleData = data.message.map((i) => i);
        dispatch(fetchData(singleData));
      } catch (error) {
        dispatch(loadFailed(`dogs are unavailable`));
        console.log({ error });
      }
    };

这是我在使用redux商店的组件

    import React, { memo } from 'react';
    import { useSelector, useDispatch } from 'react-redux';
    import { fetchDogs } from 'store/dogs';
    import { RootState } from 'store/combineReducer';
    
    export default memo(() => {
      const state = useSelector((rootState: RootState) => ({
        "dogs": rootState.fetchDogs.dogs,
        "meta": rootState.fetchDogs.meta
      }));
      const dispatch = useDispatch();
      console.log(`Dog component`, state.dogs[0]);
    
      return (
        <div>
          {state.meta.loading ? <p>loading....</p> :
            state.dogs.map((i, index) =>
              <div key={index}>
                <ul>
                  <li>{i}</li> // I can see the strings
                </ul>
                <img style={{ "width": 50, "height": 50 }} src={i} /> //getting error in here
              </div>)}
          <br></br>
          <button onClick={() => dispatch(fetchDogs())}> display random dogs</button>
        </div>
      );
    });

共有1个答案

梁丘缪文
2023-03-14

情况如下:

  • 接口IDog具有数据[]类型的属性“dogs”。

你现在正经过我的狗。您需要深入IDogs.dogs.src以获取所需的源字符串。

因此,App.tsx的第25行应该是这样的,并且似乎一切正常:

PS:codesandbox示例仍然有效,因为它显然做了某种假设,即您需要src属性,但正如您看到的,仍然会出现错误。

编辑:经过一些拨弄的答案如下。然而,它与上面写的东西有关。

我下载了您的项目,并尝试在我的PC上运行npm。我做了两件事使其工作:

  1. 我更新了第25行以使用强制转换:src={String(i)}
  2. 我更新了反应脚本。请参阅此线程以供参考: TypeError[ERR_INVALID_ARG_TYPE]:路径参数必须是字符串类型。接收类型未定义时提出启动反应应用程序

 类似资料:
  • 这是一个类中的函数,允许你双击和单击手势。它在Swift 2.3中运行良好,但在转换到Swift 3后,它抛出了一些错误。我怎么也想不明白。我评论了它们发生的地方。

  • 问题内容: 以下语句: 因错误而失败: 为什么在这里需要演员表? 我发现了几篇文章,解释了为什么您不能进行反向操作(将T分配给a),但这是显而易见的(可以理解)。 注意:我在Eclipse Luna下对此进行编码,所以我不知道这是Luna Quirk还是泛型中确实不了解的东西。 问题答案: 协方差vs协方差vs不变性 是 不变的 。 结果是, 是 不是一个亚型 的 在Java中,变量可以保存 相同

  • 问题内容: 我试图为对象类型分配一个lambda: 它给我一个错误的说法: 为什么会这样,怎么做? 问题答案: 这是不可能的。根据错误消息不是功能接口,即具有单个公共方法的接口,因此您需要使用引用类型,例如

  • 问题内容: 使用Java5,我们可以编写: 或仅在for循环中使用Iterable。这非常方便。 但是,您不能像这样编写可迭代的通用方法: 并使用数组调用它,因为它不是Iterable: 我想知道这个设计决定背后的原因。 问题答案: 数组可以实现接口(和)。那为什么不呢?我猜想Iterable强制添加方法,而数组不实现方法。甚至不覆盖。无论如何,应将引用数组视为不理想的-使用。如dfa注释所示,将

  • 这是我的水果 现在我正在导入另一个typescript文件中的fruit.ts。这是我的 当我做的时候 我得到一个错误: 类型“string”不能分配给类型“orange”“apple”“banana”“ 如何将字符串赋给自定义类型fruit的变量?

  • 我没有找到我的问题的答案,所以我在这里问它