reactjs - Kuinka korjata Binding-elementti 'children' sisältää oletusarvoisesti 'any'-tyypin.ts(7031)?


Jotenkin puuttuu jotain tässä validoinnissa, miten lisään tyypin validoinnin? Saan virheen "elementti 'children' on implisiittisesti tyypiltään 'any'".

import * as React from 'react';
import Button from './Styles';

const Button1 = ({ children, ...props }) => (
  <Button {...props}>{children}</Button>
);

Button1.propTypes = {};

export default Button1;

Vastaus #1

Muokattu 2022: react 18:n kanssa FC ei enää tarjoa lapsia, joten sinun täytyy määritellä se itse, ja voit jättää FC:n pois:

import React, { ReactNode } from "react";

interface Props {
    children?: ReactNode
    // any props that come into the component
}

const Button1 = ({ children, ...props }: Props) => (
    <Button {...props}>{children}</Button>
);

Kyllä, sinulta puuttuu tyyppi Propsille kokonaisuudessaan, mikä tarkoittaa, että TypeScript näkee sen any:na ja ts-sääntösi eivät salli sitä.

Sinun täytyy kirjoittaa propsisi muodossa:

import React, { FC } from "react";

interface Props {
    // any props that come into the component
}

const Button1: FC<Props> = ({ children, ...props }) => (
    <Button {...props}>{children}</Button>
);

Vastaus #2

Tämä oli minulle suuri ongelma ja tuhlasin paljon aikaa oikean ratkaisun selvittämiseen. Tällä hetkellä sinulla on virhe children-propin kanssa, mutta tulevaisuudessa saatat kohdata tämän virheen monissa funktioissa, joissa purat parametreja. Joten ehdottaisin, että seuraat tätä GitHub-asiaa.

const yourfunc = ({destructuredProps}: {destructuredProps: type}) => {}

Vastaus #3

Voit myös lisätä ennalta määritellyn tyypin funktionaalisiin komponentteihisi näin:

const Button1: React.FC<{}>  = ({ children }) => (
    <Button>{children}</Button>
);

Tällä tavalla sinun ei tarvitse toistaa itseäsi määritellessäsi children-propsia.

Täydellisempi versio voisi olla tällainen:

interface Props {
// any other props that come into the component, you don't have to explicitly define children.
}

const Button: React.FC<Props> = ({ children, ...props }) => {
  return (
      <Button {...props}>{children}</Button>
  );
};

Huomaa, että se toimii React 16.8 kanssa

Vastaus #4

Toisena lähestymistapana voit käyttää sisäänrakennettua geneeristä tyyppiä "React.PropsWithChildren" lapsille propseissa, käsitellen nämä propsit asianmukaisesti. Hyvin lyhyt koodi näyttäisi tältä:

import React from "react";
import Button from "./Styles";

type MyComponentProps = React.PropsWithChildren<{}>;

export default function MyComponent({ children, ...other}: MyComponentProps) {
  return <Button {...other}>{children}</Button>;
}

Vastaus #5

Se tarvitsee 'any', joten anna sille!

const Button1 = ({ children, ...props } : any)

Käsittele se sitten funktiossa, jos haluat säilyttää tyypin

Vastaus #6

Voit käyttää myös tyyppejä

type ButtonProps = {
    children: ReactNode;
    
}

const Button = ({ children }: ButtonProps) => (
    <button>{children}</button>
);

Aiheeseen liittyviä artikkeleita