我正在开发一个于2016年创建的reactJS应用,我正在尝试对其进行功能修补。这些文件的扩展名为.tsx,应用编译器会在呈现之前查找所有打字稿错误。因此,现在我试图在单击主复选框输入时实现所有复选框的选择,但是就目前而言,我在调用“ checkboxElement.checked = true”时遇到TS2339错误。
主复选框
<input type="checkbox" onChange={this.checkAllBoxes} />
从属复选框
<Col lg={1}>
<input type="checkbox" />
</Col>
选择所有框方法
checkAllBoxes() {
const allCheckBoxes = document.querySelectorAll("input[type='checkbox']") as NodeListOf<Element>;
allCheckBoxes.forEach(checkBox => {
console.log(checkBox);
if(checkBox && checkBox.checked) checkBox.checked = true;
});
}
正如我在console.log中看到的那样,checkBox
有checked getter and setter method
,但是编译时出现TS2339错误。我很难相信我正面临如此基本的功能。
错误:(我在编译窗口中两次记录此错误)
error TS2339: Property 'checked' does not exist on type 'Element'.
我尝试将查询从querySelectorAll更改为具有相应更改的getElementByID和getElementsByClassname。我更喜欢使用querySelectorAll,但没有严格的指导原则。我看过这个github link,他们说他们已经解决了这个问题,但对我来说不起作用。
答案 0 :(得分:2)
Typescript无法知道返回的HTML元素是输入(它们确实具有checked
属性。
最简单的解决方案是断言querySelectorAll
返回HTMLInputElement
的列表
const allCheckBoxes = document.querySelectorAll("input[type='checkbox']") as NodeListOf<HTMLInputElement>;
allCheckBoxes.forEach(checkBox => {
console.log(checkBox);
if(checkBox && checkBox.checked) checkBox.checked = true;
});
答案 1 :(得分:0)
您正在将allCheckBoxes列表强制转换为NodeListOf,但是Element(正确)没有任何选中的属性。
相反,您应该将其强制转换为NodeListOf,这是复选框的正确接口(checked属性仅针对元素定义)
答案 2 :(得分:0)
针对循环进行迭代,而不会强制转换为NodeListOf<Element>
。
checkAllBoxes() {
const allCheckBoxes = document.querySelectorAll("input[type='checkbox']");
if(allCheckBoxes){
for(let i = 0; i< allCheckBoxes.length ; i++){
console.log(allCheckBoxes[i]);
if(allCheckBoxes[i] && allCheckBoxes[i].checked) {
allCheckBoxes[i].checked = true;
}
}
}
}