[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [Type](https://evolu.dev/docs/api-reference/common/Type) › recursive

```ts
function recursive<ParentType>(
  create: () => ParentType,
): RecursiveType<ParentType>;
```

Defined in: [packages/common/src/Type.ts:3808](https://github.com/evoluhq/evolu/blob/e7144e2bbe9069362b62dec1b64a8aa922b8f1b0/packages/common/src/Type.ts#L3808)

Recursive [Type](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).

Recursive types can't be inferred, so we must define them using an interface
and `recursive` Type Factory that returns a [Type](https://evolu.dev/docs/api-reference/common/Type/interfaces/Type).

### Example

```ts
interface Category {
  readonly name: string;
  readonly subcategories: ReadonlyArray<Category>;
}

interface CategoryInput {
  readonly name: string;
  readonly subcategories: ReadonlyArray<CategoryInput>;
}

type CategoryError = ObjectError<{
  readonly name: typeof String.Error;
  readonly subcategories: ArrayError<CategoryError>;
}>;

const Category = recursive(
  (): Type<"Object", Category, CategoryInput, CategoryError> =>
    object({
      name: String,
      subcategories: array(Category),
    }),
);
```