Typescript 错误和由 ...props 引起的传播运算符?

nux*_*xer 1 javascript node.js typescript reactjs formik

嗨,当我尝试在 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);
      }}
    />
  );
};
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

据我了解,此函数接受扩展运算符,因此这意味着它接受具有 0 个或多个属性的对象/数组。它自动分配了类型{ [x: string]: any; },这意味着有一个键 (x) 的值类型为 any。但是,我不知道如何解决打字稿给出的这个错误。

nux*_*xer 5

好的,经过这里的一些研究,我发现可以修复错误。

语法 '{ [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);
      }}
    />
  );
Run Code Online (Sandbox Code Playgroud)