Flow clearTimeout несовместим с TimeoutID

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

Я все еще разбираюсь в концепции let arr: Array<React$Element<Component>> = []

Но есть вещи, которые пока я исследую, я не могу понять, как определить тип переменной, которую я буду использовать для clearTimeout.

используя то, что сказал этот парень: Регрессия 0.63.x: типы возвращаемых значений setTimeout () и setInterval () не работают

он говорит использовать:

const foo: TimeoutID = setTimeout(() => {}, 300);
const bar: IntervalID = setInterval(() => {}, 300);

но в итоге мне нужно сделать clearTimeout(), и я получаю:

Cannot call clearTimeout with this.playerTimeOut bound to timeoutId because null or undefined (see line 17) is incompatible with TimeoutID (see https://github.com/facebook/flow/blob/v0.78.0/lib/core.js#L733).

Код:

playerTimeOut: ?TimeoutID = null;

componentDidMount() {
  const { children } = this.props;
  const { index } = this.state;

  this.playerTimeOut = setTimeout(() => {
    clearTimeout(this.playerTimeOut);

    this.setState({
      index: index >= this.total ? 0 : index + 1
    });
  }, parseInt(children[index].attr.runningtime) * 1000);
}

Очень признателен за любую помощь или конструктивные улучшения: D

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
1 935
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не уверен, что за волшебство вы реализуете, но заметите, что тайм-аут будет сброшен сразу при первом запуске, поэтому вам не нужно явно вызывать clearTimeout.

Однако, если вы уверены, что вам это нужно, посмотрите, как выглядит поток:

playerTimeOut: ?TimeoutID = null;

поэтому он может быть нулевым или неопределенным.

Чтобы исправить это либо:

а) определить без может напечатать:

playerTimeOut: TimeoutID; // no question mark, no default value.

Пытаться

б) уточнить возможно тип с использованием условия if:

if (this.playerTimeOut) {
   clearTimeout(this.playerTimeOut);
}

спасибо за прекрасное объяснение! Конечно, без типа «возможно» и слов, это просто незарегистрированная переменная этого типа, она должна очистить тайм-аут, но по-прежнему иметь тип TimourID! ты просто класс!! Еще одно СПАСИБО за объяснение с методом б), это помогло с другим вопросом, который у меня был: stackoverflow.com/questions/53302201/… Так что спасибо!

Joseph Briggs 15.11.2018 12:35

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