Ввод пространств имен React

#reactjs #typescript #typescript-typings #react-typescript

Вопрос:

Я пытаюсь понять, как вводить пространства имен react.

В настоящее время у меня есть компонент

 import {Head} from "./head/head";
import {Body} from "./body/body";

interface Props {
  id: string
}

const Component:React.FC<Props> = ({id}) =>{
return <span>Hello World</span>
};

Component.Head = Head;
Component.Body = Body;
 

использование-это что-то вроде

 <Component>
 <Component.Head></Component.Head>
 <Component.Body></Component.Body>
</Component>
 

Я продолжаю получать эту опечатку

Свойство «Head» не существует для типа «FC»

Что я упускаю?

Ответ №1:

Ну, вы говорите, что «Компонент» имеет тип React.FC. Это означает, что он имеет свойства / структуру типа, определенного в React.FC.

Но затем вы даете компоненту два свойства Головы и тела, которые не определены в React.Тип ФК.

Поэтому, если бы вы действительно хотели сделать то, что пытаетесь сделать в своем коде, вам нужно было бы определить свой собственный тип, расширяющий React.FC и ожидает как свойств головы, так и тела.

 type TypeNameHere<Props> = React.FC<Props> amp; {
  Head: *TypeOfWhateverHeadWillBeHere*;
  Body: *TypeOfWhateverBodyWillBeHere*;
};
 

Затем вы бы использовали это для определения компонента

 const Component:TypeNameHere<Props> = ....;
 

Я приведу более простой пример без реакции на демонстрацию:

 type TypeExample1 = (props: string) => void;

const Component:TypeExample1 = (name) => console.log(name);

Component.Head = 'Head here'; //Error: Property Head does not exist on type TypeExample1
Component.Body = 'Body here'; //Error: Property Body does not exist on type TypeExample1
 

Приведенный выше код приведет к той же ошибке, потому что, согласно определению TypeExample1, это должна быть просто функция, которая принимает строку и ничего не возвращает, без каких-либо свойств Головы или тела.

Принимая во внимание, что приведенный ниже код позволит это сделать, создав новый тип TypeExample2, который расширяет TypeExample1, чтобы также включать свойства для головы и тела:

 type TypeExample1 = (props: string) => void;

type TypeExample2 = TypeExample1 amp; {Head: string; Body: string;}

const Component:TypeExample2 = (name) => console.log(name);


Component.Head = 'Head here';
Component.Body = 'Body here';
 

Надеюсь, это поможет!

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

1. Спасибо @kevin. Объяснил это очень хорошо!

2. @JohnZ Рад, что смог помочь!