您好,当我尝试将扩展运算符与 Typescript 结合使用时,我遇到了问题。
我有一个函数,其中 useFormikContext()
和 useField()
函数来自 Formik 的库。当我添加 //@ts-ignore
时,一切都按预期正常工作,但是,如果没有该行,我会收到错误:
const DatePickerField = ({ ...props }) => {
const { setFieldValue } = useFormikContext();
//@ts-ignore
const [field] = useField(props);
return (
<DatePicker
{...field}
{...props}
selected={(field.value && new Date(field.value)) || null}
onChange={(val) => {
setFieldValue(field.name, val);
}}
/>
);
};
Argument of type '{ [x: string]: any; }' is not assignable to parameter of type 'string | (ClassAttributes<HTMLInputElement> & InputHTMLAttributes<HTMLInputElement> & FieldConfig<any>) | (ClassAttributes<...> & ... 1 more ... & FieldConfig<...>) | (ClassAttributes<...> & ... 1 more ... & FieldConfig<...>)'.
Type '{ [x: string]: any; }' is not assignable to type 'ClassAttributes<HTMLInputElement> & InputHTMLAttributes<HTMLInputElement> & FieldConfig<any>'.
Property 'name' is missing in type '{ [x: string]: any; }' but required in type 'FieldConfig<any>'. TS2345
据我了解,这个函数接受扩展运算符,这意味着它接受具有 0 个或多个属性的对象/数组。它自动被分配类型 { [x: string]: any; }
这意味着有一个值类型为any 的键(x)。但是,我不知道如何修复 typescript 给出的这个错误。
最佳答案
好吧,经过一番研究后,我发现可以修复这些错误。
语法 '{ [x: string]: any; }' 让我知道这个对象有一个键 x,它是一个值为 any 的字符串。我在提问时不知道这一点,我有点困惑。 https://www.typescriptlang.org/docs/handbook/advanced-types.html <-- 索引类型和索引签名
Typescript 还让我知道 useField()
函数需要值字符串的属性名称。所以我使用这个新发现的知识输入了它,并摆脱了未使用的函数selected
,新代码现在如下所示:
const DatePickerField = ({ ...props }: { [x: string]: any; name: string }) => {
const { setFieldValue } = useFormikContext();
const [field] = useField(props);
return (
<DatePicker
{...field}
{...props}
// selected={(field.value && new Date(field.value)) || null}
onChange={(val) => {
setFieldValue(field.name, val);
}}
/>
);
关于javascript - Typescript 错误和展开运算符是由 ...props 引起的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61312273/