DEV Community

Cover image for 🔧 Fixing “Index Signature” Errors in Inertia's useForm with TypeScript
anRecky
anRecky

Posted on

🔧 Fixing “Index Signature” Errors in Inertia's useForm with TypeScript

When developing a web app with Laravel 12, Inertia.js, React.js, and TypeScript, I ran into a subtle but frustrating TypeScript error when using useForm from Inertia.

I defined my form shape using an interface, like this:

interface DepartmentForm {
  name: string;
  abbr: string;
  degree: 's1' | 's2';
  vision: string | null;
  mission: string | null;
  description: string | null;
  order: number | null;
  photo_url?: string;
}
Enter fullscreen mode Exit fullscreen mode

Then passed it into useForm:

const { data, setData, post, processing, errors, reset } = useForm<DepartmentForm>({
  name: '',
  abbr: '',
  degree: 's1',
  vision: '',
  mission: '',
  description: '',
  order: 0,
  photo_url: '',
});
Enter fullscreen mode Exit fullscreen mode

But TypeScript complained about the index signature not being compatible — something like:

Type 'DepartmentForm' does not satisfy the constraint '{ [key: string]: any; }'
Enter fullscreen mode Exit fullscreen mode

✅ The Fix: Use a type Instead

Changing the interface to a type fixed it immediately:

type DepartmentForm = {
  name: string;
  abbr: string;
  degree: 's1' | 's2';
  vision: string | null;
  mission: string | null;
  description: string | null;
  order: number | null;
  photo_url?: string;
};
Enter fullscreen mode Exit fullscreen mode

No more type errors!


💬 Why does this happen?

interface in TypeScript doesn’t allow excess properties unless an index signature is explicitly declared. On the other hand, type is more flexible when passed to generic utilities like Inertia's useForm that expect dynamic key access ([key: string]: any).


I hope this helps someone out there who's scratching their head like I was. If you've encountered similar quirks with Inertia and TypeScript, feel free to share in the comments!

Top comments (0)