Как исправить ошибку «Свойство «строка» не существует для типа «объект»» в Typescript

#reactjs #typescript #react-router-dom

#reactjs #typescript #react-router-dom

Вопрос:

Я пытаюсь реализовать восстановление прокрутки в маршрутизаторе React, используя Typescript с кодом ниже.

 import { Component } from 'react';

import { withRouter } from "react-router-dom";

export interface IProps {
  prevProps?: any;
  location: object;
  pathname?: any;
}

class ScrollToTop extends Component<IProps, object> {

  componentDidUpdate(prevProps?: any) {
    if (this.props.location.pathname !== prevProps.location.pathname) {
      window.scrollTo(0, 0);
    }
  }

  render() {

    return this.props.children;

  }

}

export default withRouter(ScrollToTop);
  

Тем не менее, я продолжаю получать следующую ошибку TS при добавлении типов для местоположения и пути.

(14,29): Property 'pathname' does not exist on type 'object'.

Почему мой код неверен?

Ответ №1:

Как упоминалось в другом ответе, withRouter должно быть импортировано из react-router .

Но чтобы ответить на ваш вопрос об ошибке Typescript, это связано location с тем, что он был определен как object для typescript без указания на него свойств. Вот почему при попытке доступа pathname к нему возникает ошибка.

К счастью, вам не нужно записывать все свойства в location prop. Вместо этого вы можете установить типы react-router с:

 npm install --save @types/react-router @types/react-router-dom
  

При создании компонента, который наследует эти реквизиты (совпадение, местоположение, история), просто расширьте RouteComponentProps :

 import { RouteComponentProps } from "react-router";

interface IProps extends RouteComponentProps {
  // other props
}
  

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

1. withRouter доступно с react-router-dom . Тем не менее, ваш ответ сработал. Ранее я установил @types/ react-router и @types/ react-router-dom, но, думаю, я не использовал --save флаг. Я просто переустановил со строкой выше.