Вы можете переместить / добавить тип к аргументу обратного вызова map
, поскольку теперь он применяется только к первому аргументу React.cloneElement
.
const childrenWithProps = React.Children.map(children, (child: ReactChild) => // <- Here
React.cloneElement(child, { // <- Assertion here can be omitted
onClick: (e: React.FormEvent) =>
childrenClickHandler(
e,
child.props.children,
onItemClick && onItemClick(e),
),
}),
);
Утверждение имеет ту же область действия, что и переменная, поэтому
React.Children.map(children, child => ...)
без типа делает child
тип any
(если вы не указали тип children
каким-либо образом)
Тогда child
используется в качестве аргумента и зависит для типа функции и вашего tsconfig может потребоваться значение какого-то типа
React.cloneElement(child, ...)
. Вы ставите здесь утверждение, но это влияет на использование child
в качестве аргумента. На самом деле можно применить то же утверждение ко второму использованию:
React.cloneElement(child as ReactChild, {
onClick: (e: React.FormEvent) =>
childrenClickHandler(
e,
(child as ReactChild).props.children, // <- Here
onItemClick && onItemClick(e),
),
}),
Но в этом случае лучше указать тип переменной, в которой она определена, чтобы она имела одинаковый тип во всех его сфера применения.