Я пытаюсь расширить интерфейс для импорта из реакции, но получаю сообщение об ошибке: TS2430: Interface 'IProps' incorrectly extends interface 'HTMLProps<HTMLTableCellElement>'..
Это мой полный код и сообщение об ошибке:
import cx from 'classnames';
import { HTMLProps } from 'react';
import styles from './index.module.scss';
export interface IProps extends HTMLProps<HTMLTableCellElement> {
title?: string;
className?: string;
wrap?: boolean;
}
export const Th = ({ title, className, wrap, ...rest }: IProps) => {
return (
<th
data-title = {title}
{...rest}
className = {cx(wrap && styles.wrap, className)}
/>
);
};
И сообщение об ошибке:
ERROR in.../Th.tsx:6:18
TS2430: Interface 'IProps' incorrectly extends interface 'HTMLProps<HTMLTableCellElement>'.
Types of property 'wrap' are incompatible.
Type 'boolean | undefined' is not assignable to type 'string | undefined'.
Type 'boolean' is not assignable to type 'string'.
4 | import styles from './index.module.scss';
5 |
> 6 | export interface IProps extends HTMLProps<HTMLTableCellElement> {
| ^^^^^^
7 | title?: string;
8 | className?: string;
9 | wrap?: boolean;
Что я пытаюсь сделать: я пытаюсь импортировать все типы из HTMLProps<HTMLTableCellElement>, но добавляю новые, такие как wrap, ...etc. Я думаю, что ошибка связана с тем, что className уже определен как string внутри HTMLProps<HTMLTableCellElement>, и я не могу переопределить это?
Чего я ожидаю: я ожидал, что смогу расширять типы из импортированных интерфейсов. Я не хочу переопределять импортированные типы.
Это решило проблему, спасибо @pink. Если вы опубликуете это как ответ, я отмечу его как одобренный.





Здесь ошибка, потому что кажется, что HTMLProps включает атрибут обтекания текстовых областей. Я не совсем уверен, что это именно из текстовых полей (похоже, что wrap поддерживается для большинства текстовых элементов). Поскольку это boolean для элементов textarea, повторный ввод его в string недействителен. Простым обходным решением было бы просто переименовать свойство:
export interface IProps extends HTMLProps<HTMLTableCellElement> {
title?: string;
className?: string;
shouldWrapText?: boolean; // okay
}
export const Th = ({ title, className, shouldWrapText, ...rest }: IProps) => {
return (
<th
data-title = {title}
{...rest}
className = {cx(shouldWrapText && styles.wrap, className)}
/>
);
};
wrapуже существует в элементе textarea. Поэтому не следует перезаписывать его. Назовите свой реквизит как-нибудь иначе, напримерshouldWrapилиwrapped.