Добро пожаловать в сообщество!
Ваш Engli sh совершенен, не волнуйтесь, продолжайте стараться и всегда публиковайте как можно больше данных, чтобы мы могли помочь вам.
Ваша ошибка очень ясна, но ваша проблема заключается в понимании грязного сообщения Typescript, давайте разберем его.
Property 'store' does not exist on type 'Readonly<AppInitialProps & { Component: NextComponentType<NextPageContext<any, AnyAction>, any, {}>; router: Router; __N_SSG?: boolean | undefined; __N_SSP?: boolean | undefined
; }> & Readonly<...>'.
Вам нужно беспокоиться о свойстве store
, которое вы хотите извлечь из эта строка:
const { Component, store } = this.props;
В сообщении об ошибке говорится, что свойство store
не существует в this.props
. TypeScript, среди прочего, проверит наличие свойств, и он проверяет типы. this.props
имеет следующий тип (из сообщения об ошибке):
Readonly<AppInitialProps & { Component: NextComponentType<NextPageContext<any, AnyAction>, any, {}>; router: Router; __N_SSG?: boolean | undefined; __N_SSP?: boolean | undefined
; }> & Readonly<...>
Я рекомендую взглянуть на Расширенные типы TypeScript , чтобы понять, что такое Readonly
среди других, которые вы увидите при работе с ТС. Но, в двух словах, приведенный выше тип является комбинацией нескольких типов, попробуйте прочитать его следующим образом:
Readonly<A & B & C>
Оператор &
объединяет два типа. Полученный выше тип будет представлять собой комбинацию типов A
, B
и C
, а свойства будут readonly
, что означает, что вам не следует изменять значение свойств.
Вот пример, который я сделал для вас:
type PersonProfile = {
name: string;
};
type PersonAge = {
age: number
}
type FullProfile = PersonProfile & PersonAge;
const personA: PersonProfile = { name: "Murillo" };
personA.name = "Henrique"; // ok
const fullPersonData: PersonProfile & PersonAge = { name: "Murillo", age: 103 };
const anotherFullPersonData: FullProfile = { name: "Henrique", age: 574 }; // The same
const personB: Readonly<PersonProfile> = { name: "John" };
personB.name = "Doe"; // Error, Cannot assign to 'name' because it is a read-only property
Решение
Вы можете сделать следующее, чтобы удалить ошибку и проверить, все ли работает.
const { Component, store } = this.props as any;
Это меняет тип this.props
от этого беспорядочного материала до any
, а any
может содержать любое свойство. Вы можете сделать это в целях тестирования, но я не рекомендую использовать его, на самом деле такие инструменты, как eslint , могут не позволять вам это делать (что нарушает цель использования TypeScript).
Вы также заметите, что потеряете предложения вашего редактора, потому что он больше не знает, что такое store
и Component
.
Я рекомендую вам изменить тип props
из вашего компонента, поэтому тип будет тем типом, который у него есть в данный момент + хранилище, которое вы хотите извлечь. Возможно, у вас есть небольшая работа над этим, но я обещаю, что это будет неплохое обучение.
Это может помочь вам изменить тип реквизита во всем компоненте (не читал все это).
Решение 2
// ...
type MyAmazingReduxStore = { store: any } // Change *any* to the correct type. check the redux documentation
// ...
const { Component, store } = this.props as Readonly<typeof this.props & MyAmazingReduxStore>
Это меняет тип props
на тип + ваш новый тип. Проблема в том, что вы не измените тип реквизита во всем компоненте, только в этой строке кода.
Не беспокойтесь, если сейчас слишком много информации, продолжайте пытаться!