When writing out a type
or interface
in TypeScript for something that will
be fed into a recursive function
you could cop out and use any
or you could properly define the structure.
Fortunately, both type
and interface
allow you to be self referential in
terms of defining properties.
Let’s say you have an array of objects that looks like this:
const recursiveData = [
{
name: 'First',
children: [
{
name: 'Second',
children: [
{
name: 'Third',
children: [
{
name: 'Fourth',
children: [
{
name: 'Fifth',
children: [
// On and on...
],
},
],
},
],
},
],
},
],
},
We could very well just define a type
or interface
with the exact number of
levels that we see here, but it wouldn’t handle the open ended nature of the
// On and on...
comment.
For scenarios where the data structure isn’t predictable, we can define a type
like this:
type RecursiveObject = {
name: string
children?: RecursiveObject
type RecursiveObjects = RecursiveObject
If you’d rather use an interface
instead, just adjust the syntax:
interface RecursiveObject {
name: string
children?: RecursiveObject
}
// and reference it as
const recursiveData: RecursiveObject
Since your type
or interface
can reference itself as such, you’re all set!