TypeScript抱怨我的setState语句正在使用属性访问器

时间:2018-09-03 06:57:58

标签: reactjs typescript

在下面的代码示例中,我尝试为多个输入使用一个onInputChange处理程序,TypeScript在语句class ViewController: UIViewController, UITableViewDatasource { var questionData: Questions? override func viewDidLoad() { super.viewDidLoad() tableView.register(UINib(nibName: "NH_questionheader", bundle: nil), forCellReuseIdentifier: "HeaderCell") tableView.register(UINib(nibName: "CellTableViewCell", bundle: nil), forCellReuseIdentifier: "Cell") // You don't show how you load your JSON, but assuming you have it in an instance of `Data` called `jsonData`: do { self.questionData = try JSONDecoder().decode(Questions.self, from: jsonData) } catch { print("Error decoding JSON: \(error.localizedDescription)") } } func tableView(_ tableView: UITableView, viewForHeaderInSection section: IndexPath) -> UIView? { let identifier = "HeaderCell" guard let questionData = self.questionData, let headercell = tableView.dequeueReusableCell(withIdentifier: identifier) as? NH_questionheader else { return nil } headercell.label.text = questionData.questions[section].question return headercell } func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 150 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.questionData?.questions[section].options.count ?? 0 } func numberOfSections(in tableView: UITableView) -> Int { return self.questionData?.questions.count ?? 0 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let identifier = "Cell" // Note, I have used force unwrapping and a forced downcast here as if either of these lines fail you have a serious problem and crashing is the simplest way of finding it during development let option = self.questionData!.questions[indexPath.section].options[indexPath.row] let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath ) as! CellTableViewCell cell.contentView.backgroundColor = .clear cell.label.text = option return cell } } 上给了我以下错误:

{[name]: value}

这是怎么了?我该如何解决?

[ts]
Argument of type '{ [x: number]: string | boolean; }' is not assignable to parameter of type 'SoftwareLicenseCodesState | ((prevState: Readonly<SoftwareLicenseCodesState>, props: Readonly<SoftwareLicenseCodesProps>) => SoftwareLicenseCodesState | Pick<SoftwareLicenseCodesState, "count" | ... 4 more ... | "distributor"> | null) | Pick<...> | null'.
  Type '{ [x: number]: string | boolean; }' is not assignable to type 'Pick<SoftwareLicenseCodesState, "count" | "oneTimeUsage" | "duration" | "validFrom" | "validTo" | "distributor">'.
    Property 'count' is missing in type '{ [x: number]: string | boolean; }'.

1 个答案:

答案 0 :(得分:2)

您尚未显示错误所抱怨的接口(LicenseCodesStatePick),但我将假定它们的定义与引用的SoftwareLicenseCodesState类似。 / p>

要允许像this.setState({[name]: value});这样的动态属性分配,您需要向定义添加动态属性访问权限:

interface SoftwareLicenseCodesState {
    count: string;
    oneTimeUsage: boolean;
    duration: string;
    validFrom: string;
    validTo: string;
    distributor: string;
    [key: string]: any;            // <===
}

当然,这意味着您在执行类型检查时会丢失类型检查(而在使用文字属性名称时仍会丢失类型检查)。

该手册将其称为“字符串索引签名”,在Interfaces下进行了介绍。