我想用Typescript 写上下文.因此,这里的API是通过axios绘制的,并用卡片写到屏幕上.但它给出了一个关于上下文类型的错误,我如何消除它?

我的错误是:类型‘{Data:ProductList|未定义;setData:React.Dispatch<React.SetStateAction<ProductList|未定义>>;}’不可分配给类型‘ProductType[]’. 对象文本只能指定已知的属性,并且‘ProductType[]’类型中不存在‘Data’.

import axios from "axios";
import { createContext, useEffect, useState } from "react";
interface ContextChildrenProps {
    children: JSX.Element
}

export interface SingleProduct {
    title: string,
    description: string,
    thumbnail: string
}

export interface productType {
    product: SingleProduct
}

export interface ProductList {
    data: productType[]
}

export const GlobalProductsContext = createContext<productType[] | null>({} as productType[])

export const ProductsContextProvider = ({ children }: ContextChildrenProps) => {

    const [data, setData] = useState<ProductList>()

    useEffect(() => {
        axios.get('https://fakestoreapi.com/products')
            .then(res => {
                console.log(res)
                setData(res.data)
            })

    }, [])

    return (
        <GlobalProductsContext.Provider value={{ data, setData }}>
            {children}
        </GlobalProductsContext.Provider>
    )
}



import React from 'react'
import { productType } from '../context/GlobalData'

const SingleCard = ({ product }: productType) => {
    return (
        <>
            <div className="col-lg-4 p-2" data-aos="flip-left">
                <div className="card" style={{ width: '100%', height: '100%' }}>
                    <img src={product.thumbnail} className="card-img-top" alt="..." />
                    <div className="card-body">
                        <h5 className="card-title">{product.title}</h5>
                        <p className="card-text">{product.description}</p>
                        <a href="#" className="btn btn-primary">Go somewhere</a>
                    </div>
                </div>
            </div>
        </>
    )
}

export default SingleCard

推荐答案

上下文值的TS类型不正确.

try :

import axios from "axios";
import React, { createContext, useEffect, useState } from "react";

interface ContextChildrenProps {
  children: JSX.Element
}

export interface SingleProduct {
  title: string,
  description: string,
  thumbnail: string
}

type ProductContext = {
  data: SingleProduct[];
  setData: React.Dispatch<React.SetStateAction<SingleProduct[]>>
}

export const GlobalProductsContext = createContext<ProductContext>({ data: [], setData: () => { } })

export const ProductsContextProvider = ({ children }: ContextChildrenProps) => {
  const [data, setData] = useState<SingleProduct[]>([])

  useEffect(() => {
    axios.get('https://fakestoreapi.com/products')
      .then(res => {
        console.log(res)
        setData(res.data)
      })

  }, [])

  return (
    <GlobalProductsContext.Provider value={{ data, setData }}>
      {children}
    </GlobalProductsContext.Provider>
  )
}

Typescript相关问答推荐

为什么ESLint抱怨通用对象类型?

TS不推断类型在条件判断后具有属性'

如何使用泛型类型访问对象

输入元素是类型变体的对象数组的正确方法是什么?'

STypescript 件的标引签名与功能签名的区别

对于合并对象中的可选属性(例如选项),类型推断可能是错误的

Angular NgModel不更新Typescript

如何使我的函数专门针对联合标记?

如何使用Geojson模块和@Types/Geojson类型解析TypeScrip中的GeoJSON?

Angular文件上传到Spring Boot失败,多部分边界拒绝

如何在已知基类的任何子类上使用`extends`?

如何使用泛型函数参数定义类型脚本函数

字符串文字联合的分布式条件类型

TypeScrip:从嵌套的对象值创建新类型

任何导航器都未处理有效负载为";params";:{";roomId";:";...";}}的导航操作

可以用任意类型实例化,该类型可能与

Typescript不允许在数组中使用联合类型

TS 排除带点符号的键

Typescript 子类继承的方法允许参数中未定义的键

Next.JS-13(应用程序路由)中发现无效的中间件