React + Typcript: как ввести event.target.name в состояние?

Вы можете передать обратный вызов и вызвать обратный вызов внутри асинхронного вызова

примерно так:

class func getGenres(completionHandler: (genres: NSArray) -> ()) {
    ...
    let task = session.dataTaskWithURL(url) {
        data, response, error in
        ...
        resultsArray = results
        completionHandler(genres: resultsArray)
    }
    ...
    task.resume()
}

, а затем вызвать этот метод:

override func viewDidLoad() {
    Bookshop.getGenres {
        genres in
        println("View Controller: \(genres)")     
    }
}
0
задан deltaskelta 13 July 2018 в 13:37
поделиться

2 ответа

Тип возврата Object.keys() является общим string[], а не массивом объединения ключей объекта, поэтому, вероятно, сложно определить правильные типы здесь. Более того, по моему опыту, интеллектуальные решения имеют тенденцию ломаться, когда выпущены новые версии определений типов TypeScript или типов пакетов, поэтому в этом случае я бы просто помог TypeScript с сигнатурой в аргументе setState:

handleChange = (e: React.ChangeEvent<HTMLInputElement>, value: string): void => {
  const key = e.currentTarget.name;

  if (Object.keys(this.state).includes(key)) {
    this.setState({[key]: value } as Pick<State, keyof State>);
  }
}
1
ответ дан Oblosys 17 August 2018 в 12:42
поделиться
  • 1
    хорошо, это именно то, что я искал. Я знал, что должен быть простой способ сделать что-то подобное. благодаря – deltaskelta 13 July 2018 в 16:01

Один вариант был бы вместо итерации через ключи, чтобы использовать оператор switch. Хотя он будет генерировать больше кода:

switch (key) {
  case 'responses':
    this.setState({ responses: value });
    break;
  case 'comments':
    this.setState({ comments: value });
    break;
}
1
ответ дан Tomas Kirda 17 August 2018 в 12:42
поделиться
  • 1
    Есть ли другой путь? Мой объект состояния на самом деле намного больше, я просто сократил его для вопроса – deltaskelta 13 July 2018 в 13:53
Другие вопросы по тегам:

Похожие вопросы: