javascript - TypeScript-fel: Typen 'string' kan inte tilldelas typen för Typography
Jag försöker använda Typography-komponenten från material-ui med TypeScript, men jag får det här konstiga felet
TypeScript error: Type 'string' is not assignable to type 'ComponentClass<HTMLAttributes<HTMLElement>, any> | FunctionComponent<HTMLAttributes<HTMLElement>> | undefined'. TS2322
8 | }
9 | export default ({ text, date }: Props) => (
> 10 | <Typography component="p" gutterBottom>
| ^
11 | {text && <span>{text}: </span>}
12 | <FormattedDate value={date} />
13 |
Så här ser min komponent ut
import React from 'react';
import { FormattedDate, FormattedTime } from 'react-intl';
import Typography from '@material-ui/core/Typography';
interface Props {
date: Date;
text?: string;
}
export default ({ text, date }: Props) => (
<Typography component="p" gutterBottom>
{text && <span>{text}: </span>}
<FormattedDate value={date} />
<FormattedTime value={date} />
</Typography>
);
Jag kan inte förstå varför "p" inte är ett accepterat värde för component-prop. Jag försökte med "h1" och "h2" vilket misslyckades på samma sätt och tydligen använder den officiella demonstrationen också strängen.
Är det något jag missar? Jag vill inte ignorera detta med // @ts-ignore, men vill åtgärda det.
Svar #1
Hade detta 2021, problemet var att jag spred HTMLAttributes från ett input mot InputBase, medan jag istället borde ha spridit InputBaseProps på rätt sätt.
I mitt fall var det relaterat till en input, men samma kan replikeras för varje komponent: så länge du använder en Material UI-komponent bör du tillhandahålla de egenskaper den begär och korrekt ställa in rätt props-typer om du använder/utökar dem.
Exempel som ger fel:
import { HTMLAttributes } from 'react';
import InputBase from '@material-ui/core/InputBase';
import inputStyle from 'Input.module.scss';
export interface InputProps extends HTMLAttributes<HTMLInputElement> {
}
export function Input(props: InputProps) {
const { ...rest } = props;
return (
<InputBase
fullWidth={true}
className={[inputStyle.input].join(' ')}
color='primary'
{...rest}
/>
);
}
(i det här fallet uppstod ett fel på color)
Korrekt sätt att göra detta:
import InputBase, { InputBaseProps } from '@material-ui/core/InputBase';
import inputStyle from 'Input.module.scss';
export interface InputProps extends InputBaseProps {
}
export function Input(props: InputProps) {
const { ...rest } = props;
return (
<InputBase
fullWidth={true}
className={[inputStyle.input].join(' ')}
color='primary'
{...rest}
/>
);
}
Svar #2
Enligt referensdokumentet som tillhandahålls av Material UI för typografi (https://material-ui.com/api/typography/)
{ h1: 'h1', h2: 'h2', h3: 'h3', h4: 'h4', h5: 'h5', h6: 'h6', subtitle1: 'h6', subtitle2: 'h6', body1: 'p', body2: 'p',}
variantMapping har dessa mappningar, så framöver om du vill använda <p>-taggar kan du använda varianttypen som body1 eller body2 istället för komponent-propen.
