我有打字问题……
基本上,我有一个用于@material-ui TextField的包装React组件,但是我无法正确设置variant属性的类型。
这就是问题的要点。@material-ui/core版本为3.9.3。
import MuiTextField, {TextFieldProps} from "@material-ui/core/TextField";
interface MyTextFieldProps {
...
variant?: TextFieldProps["variant"];
}
class MyTextField extends React.Component<MyTextFieldProps> {
...
render() {
return
...other stuff
<MuiTextField
variant={this.props.variant} />
...;
}
}
对于 MuiTextField 实例,我得到了以下编译错误:
Types of property 'variant' are incompatible.
Type '"outlined" | "filled"' is not assignable to type '"outlined"'.
Type '"filled"' is not assignable to type '"outlined"'.
我可以将此进一步压缩为仅包含属性类型:
xx() {
const variant: TextFieldProps["variant"] = this.props.variant;
const props : TextFieldProps = {
variant,
};
}
当您尝试将值赋给变体属性时,可能会遇到相同的错误,即变体值(其类型与变体属性的确切类型相符)与其自身类型不兼容。
这是怎么回事?
TextField.d.ts中的定义如下:
export interface StandardTextFieldProps extends BaseTextFieldProps {
variant?: 'standard';
InputProps?: Partial<StandardInputProps>;
inputProps?: StandardInputProps['inputProps'];
}
export interface FilledTextFieldProps extends BaseTextFieldProps {
variant: 'filled';
InputProps?: Partial<FilledInputProps>;
inputProps?: FilledInputProps['inputProps'];
}
export interface OutlinedTextFieldProps extends BaseTextFieldProps {
variant: 'outlined';
InputProps?: Partial<OutlinedInputProps>;
inputProps?: OutlinedInputProps['inputProps'];
}
export type TextFieldProps = StandardTextFieldProps | FilledTextFieldProps | OutlinedTextFieldProps;
更新
正如Daniel所指出的,这是Typescript不知道如何处理联合类型。
您可以通过使用像这样的辅助函数来解决(丑陋的)问题
import { TextFieldProps, BaseTextFieldProps } from "@material-ui/core/TextField";
const getProps = (
baseProps: BaseTextFieldProps,
variant: TextFieldProps["variant"]
): TextFieldProps => {
switch (variant) {
case "filled":
return { ...baseProps, variant };
case "outlined":
return { ...baseProps, variant };
default:
return { ...baseProps, variant };
}
};
然后将其作为<TextField ...getProps({value:"text"}, variant) />
使用,但这很丑。
我甚至敢说这是一个TypeScript问题,因为它应该能够发现所有不同变体的唯一道具都是可选的。