Вы можете передать обратный вызов и вызвать обратный вызов внутри асинхронного вызова
примерно так:
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)")
}
}
Тип возврата 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>);
}
}
Один вариант был бы вместо итерации через ключи, чтобы использовать оператор switch. Хотя он будет генерировать больше кода:
switch (key) {
case 'responses':
this.setState({ responses: value });
break;
case 'comments':
this.setState({ comments: value });
break;
}