Компонент класса React имеет свойство, но Typescript говорит, что его нет

У меня проблема с React ref и компонентом класса.

Мой упрощенный код ниже. Мы видим, что у меня есть компонент Engine со свойством getInfo. Я провожу тест this.activeElement &&, что означает, что это не null, поэтому это должен быть React.ReactElement<Engine>. Однако компилятор Typescript выдает ошибку из-за того, что у него нет свойства getInfo, как показано на снимке экрана ниже.

class Engine extends React.Component {
    getInfo(count: number): void {
        console.info('info count:', count);
    }
}

class Wizard extends React.Component {
    activeElement: null | React.ReactElement<Engine>

    topLevelGetInfo(): void {
        this.activeElement && this.activeElement.getInfo(10);
    }

    handleRef = (el: null | React.ReactElement<Engine>) => this.activeElement = el;

    render() {
        return (
            <div>
                <Engine ref = {this.handleRef} />
            </div>
        )
    }
}

Мой tsconfig.json:

{
  "compilerOptions": {
    "module": "es6",
    "target": "es6",
    "sourceMap": true,
    "jsx": "react",
    "baseUrl": "src",
    "strict": true,
    "lib": ["dom", "es2017"],
    "moduleResolution": "node",
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true
  },
  "exclude": [
    "node_modules",
    "build",
    "build_test"
  ]
}

Компонент класса React имеет свойство, но Typescript говорит, что его нет

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
0
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Похоже, ваши классы Wizard и Engine не расширяются от React.Component. Попробуйте обновить объявления вашего класса следующим образом:

class Engine extends React.Component  {
 ...

 render() { return null; }
}

class Wizard extends React.Component {
  ...
}

Кроме того, не забудьте включить требуемый метод render() для вашего компонента <Engine /> (т. Е. Как показано).

Вот рабочий пример на codeandbox.io - надеюсь, что это поможет :-)

К сожалению, моя ошибка, я забыл часть extends React.Component при наборе упрощения. У меня все еще проблема :(

Noitidart 31.10.2018 03:46

@Noitidart только что обновил ответ со ссылкой на рабочую демонстрацию - это помогает?

Dacre Denny 31.10.2018 03:47

Где вы видите ошибку? В вашей среде разработки или в CodeSandbox?

Dacre Denny 31.10.2018 04:03

@DacreDenny в обоих. Codebox и dev. Я очень ценю вашу попытку, поэтому я ставлю +1.

Noitidart 31.10.2018 04:52

@Noitidart, пожалуйста, это очень странно, потому что я, кажется, не получаю никаких синтаксических ошибок, когда запускаю образец кодового окна - просто интересно узнать, как выглядит ваш файл tsconfig.json - вы можете добавить это в свой OP?

Dacre Denny 31.10.2018 04:55

Спасибо @Dacre, я добавил tsconfig.

Noitidart 31.10.2018 19:40
Ответ принят как подходящий

Для обеспечения предполагаемого доступа к getInfo - activeElement следует указывать как тип Engine (а не React.ReactElement<Engine>) или null.

activeElement также требует начального значения null, поскольку undefined недействителен.

// Engine.
class Engine extends React.Component {

  // Get Info.
  getInfo(count: number) {
    console.info("Info Count:", count);
  }

  // Render.
  render = () => <div>Engine</div>;

}

// Wizard.
export class Wizard extends React.Component {

  // Active Element.
  activeElement: Engine | null = null;

  // Top Level Get Info.
  topLevelGetInfo() {
    const { activeElement } = this;
    if (activeElement) activeElement.getInfo(10);
  }

  // Handle Ref.
  handleRef = (el: Engine | null) => (this.activeElement = el);

  // Render.
  render() {
    return (
      <div>
        Wizard.
        <Engine ref = {this.handleRef} />
      </div>
    );
  }

  // Did Mount.
  componentDidMount() {
    console.info("Mounting Wizard.");
    this.topLevelGetInfo();
  }

}

О, большое спасибо, @Arman !! Engine на самом деле является одним из многих компонентов, которыми он может быть. Компонент должен иметь свойство getInfo, и в него внедряются некоторые свойства. Можно как-нибудь сделать React.ComponentType<{ prop1: blah }>?

Noitidart 31.10.2018 04:52

Другие вопросы по теме