Как заставить объект prop передаваться от одного компонента React к другому в TypeScript?

#reactjs #typescript

#reactjs #typescript

Вопрос:

Я пытаюсь передать пользовательский объект из одного компонента React в другие и не могу понять, что должен определить TypeScript.

Вот два файла компонентов:

FlashcardList.tsx:

 import React from 'react';
import Flashcard from './Flashcard';

interface FlashcardListProps {
    flashcards: any[]
}

const FlashcardList = ({ flashcards }: FlashcardListProps) =&&t; (
    <div className="content"&&t;
        {flashcards.map(flashcard =&&t; <Flashcard flashcard={flashcard} key={flashcard.id} /&&t;)}
    </div&&t;
);

export default FlashcardList;
  

СТРОКА: {flashcards.map(flashcard =&&t; <Flashcard flashcard={flashcard} key={flashcard.id} /&&t;)}
ОШИБКА: тип ‘{ flashcard: any; key: any; }’ не может быть присвоен типу ‘IntrinsicAttributes amp; IntrinsicClassAttributes amp; Readonly<{}&&t; amp; Readonly<{ дочерние элементы?: ReactNode; }&&t;’. Свойство ‘flashcard’ не существует для типа ‘IntrinsicAttributes amp; IntrinsicClassAttributes amp; Readonly<{}&&t; amp; Readonly<{ дочерние элементы?: ReactNode; }&&t;’

Flashcard.tsx:

 import React, { Component } from 'react';
import 'bootstrap/dist/css/bootstrap.css';
const &reyBox = require('../ima&es/&reybox.pn&');

interface Flashcard {
    cate&ory: Strin&,
    front: Strin&,
    back: Strin&
}
interface FlashcardState {
    flashcard: Flashcard
}

class Flashcard extends Component<{}, FlashcardState&&t; {

    constructor(props: FlashcardState) {
        super(props);
        this.state = {
            flashcard: Flashcard
        };
    }

    render() {
        return (
            <div className="flashcard"&&t;
                <div className="front"&&t;{this.state.flashcard.cate&ory.toUpperCase()}: {this.state.flashcard.front}</div&&t;
                <div className="back"&&t;{this.state.flashcard.back}</div&&t;
                <div className="text-success"&&t;test of bootstrap</div&&t;
                <im& src={&reyBox} alt="&rey box" className="im&-fluid" /&&t;
            </div&&t;
        )
    }
}

export default Flashcard;
  

СТРОКА: flashcard: Flashcard
ОШИБКА: у type ‘typeof Flashcard’ отсутствуют следующие свойства из type ‘Flashcard’: cate&ory, front, back, render и еще 6.ts(2740) Flashcard.tsx(19, 15): Вы имели в виду использовать ‘new’ с этим выражением?

Что мне нужно изменить, чтобы TypeScript имел то, что ему нужно с точки зрения типов / интерфейсов, поскольку объект flashcard передается от одного компонента к другому через props?

Комментарии:

1. Две проблемы: 1. вы определили flashcard как часть состояния Flashcard , но на самом деле передаете его как prop (где оно не определено); и 2. this.state = { flashcard: Flashcard } это литерал объекта, там нет информации о типе; вы пытаетесь использовать интерфейс (который не существует в исходящем JavaScript) в качестве значения .

2. Кроме того, вы затенили свой интерфейс классом, у них одинаковое имя. В этом случае кажется, что вам вообще не нужно состояние — вы можете использовать функциональный компонент для обоих (и даже в функциональных компонентах есть useState сейчас).

Ответ №1:

Я признаю, что приведенный выше вопрос был немного невежественным, но @jonrsharpe выше помог указать мне способ исправить все проблемы и заставить его работать, спасибо.

Для тех, кто еще испытывает трудности с синтаксисом TypeScript в компонентах React, вот два вышеупомянутых файла, измененных таким образом, чтобы они теперь работали. Обратите внимание, прежде всего, на то, что в FlashcardList.tsx изменился способ отправки всего объекта в виде prop ( flashcard={flashcard} ) на отправку деконструированных параметров объекта с использованием оператора spread ( {...flashcard} ), которые затем принимаются во Flashcard.tsx в качестве реквизитов этого компонента, т. Е. весь компонент имеет тип IFlashcard и поэтому просто получает деконструированные параметры по отдельности в качестве реквизитов.

FlashcardList.tsx:

 import React from 'react';
import Flashcard from './Flashcard';

interface IFlashcard {
    id: number,
    cate&ory: strin&,
    front: strin&,
    back: strin&,
    key: number
}

interface IFlashcardListProps {
    flashcards: IFlashcard[]
}

const FlashcardList = ({ flashcards }: IFlashcardListProps) =&&t; (
    <div className="content"&&t;
        {flashcards.map(flashcard =&&t; <Flashcard {...flashcard} key={flashcard.id} /&&t;)}
    </div&&t;
);

export default FlashcardList;
  

Flashcard.tsx:

 import React, { Component } from 'react';
import 'bootstrap/dist/css/bootstrap.css';
const &reyBox = require('../ima&es/&reybox.pn&');

interface IFlashcard {
    cate&ory: strin&,
    front: strin&,
    back: strin&
}

class Flashcard extends Component<IFlashcard&&t; {

    render() {
        return (
            <div className="flashcard"&&t;
                <div className="front"&&t;{this.props.cate&ory.toUpperCase()}: {this.props.front}</div&&t;
                <div className="back"&&t;{this.props.back}</div&&t;
                <div className="text-success"&&t;test of bootstrap</div&&t;
                <im& src={&reyBox} alt="&rey box" className="im&-fluid" /&&t;
            </div&&t;
        )
    }
}

export default Flashcard;