It is common to find mentions of functions as first-class citizens in the FP literature. We say that a function is a first-class citizen when it can do everything that a variable can do, which means that functions can be passed to other functions as an argument. For example, the following function takes a function as its second argument:
function find<T>(arr: T[], filter: (i: T) => boolean) {
return arr.filter(filter);
}
find(heroes, (h) => h.name === "Spiderman");
Or, it is returned by another function. For example, the following function takes a function as its only argument and returns a function:
function find<T>(filter: (i: T) => boolean) {
return (arr: T[]) => {
return arr.filter(filter);
}
}
const findSpiderman = find((h: Hero) => h.name === "Spiderman");
const spiderman = findSpiderman(heroes);
Functions can also be assigned to variables. For example, in the preceding code snippet, we assigned the function returned by the find function to a variable named findSpiderman:
const findSpiderman = find((h: Hero) => h.name === "SPiderman");
Both JavaScript and TypeScript treat functions as first-class citizens.