#reactjs #typescript #events #checkbox
Вопрос:
Я только начал стилизовать машинописный текст и, к сожалению, не смог найти решение своей проблемы. У меня есть список флажков. Я добавляю значение непроверенных флажков в массив. Но TS показывает ошибку в аргументе event.target.value типа «любой», который нельзя присвоить параметру типа «никогда».
Флажок
<Checkbox
className={classes.checkbox}
icon={item.icon}
onClick={props.switchType}
checkedIcon={item.icon}
name="checkedH"
value={item.title}
color="primary"
/>
И событие
const switchType = (event: React.ChangeEvent<HTMLInputElement>) => {
const currentIndex = checked.indexOf(event.target.value);
const newChecked = [...checked];
if (currentIndex === -1) {
newChecked.push(event.target.value);
} else {
newChecked.splice(currentIndex, 1);
}
событие.цель.значение не определено красным цветом в обоих вариантах.
Комментарии:
1. Можете ли вы предоставить полные примеры кода, так как нелегко отлаживать то, что происходит в приведенном примере кода. Укажите родительский компонент и компоненты флажка.
2.
const switchType = (event: React.ChangeEvent<HTMLInputElement>): void => {
Ответ №1:
Поскольку предоставленного вами кода недостаточно, вот типобезопасный пример, который, как мне кажется, вы пытаетесь выполнить.
Я переработал часть кода, касающегося добавления / удаления элемента, поскольку предоставленный код был неполным для создания функции примера, я также удалил некоторые ненужные реквизиты в примере, чтобы облегчить его понимание.
import * as React from "react";
const Checkbox: React.FC<{
value: string;
isChecked: (value: string) => boolean;
onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
}> = ({ value, isChecked, onChange }) => {
const checked = isChecked(value);
return (
<div>
<label htmlFor={value}>{value}</label>
<input
id={value}
type="checkbox"
value={value}
onChange={onChange}
checked={checked}
/>
</div>
);
};
function TodoList() {
const [selected, setSelected] = React.useState<string[]>([]);
const onChange = (event: React.ChangeEvent<HTMLInputElement>) => {
const { value } = event.target;
const isAlreadySelected = selected.includes(value);
setSelected((prevState) =>
isAlreadySelected
? prevState.filter((p) => p !== value)
: [...prevState, value]
);
};
const isChecked = (value: string) => {
return selected.includes(value);
};
return (
<div className="App">
<h1>Todo List</h1>
<Checkbox value="Get Milk" onChange={onChange} isChecked={isChecked} />
<Checkbox value="Get Bread" onChange={onChange} isChecked={isChecked} />
<pre>{JSON.stringify(selected)}</pre>
</div>
);
}
export default TodoList;
Из-за того, что StackOverflow не поддерживает TypeScript, вы можете просмотреть выполняемый пример здесь: https://codesandbox.io/s/focused-dewdney-9mm7b