In the first typed programming languages (e.g. Pascal), developers had to define the same data structure for each data type that was supported over and over again. For example, a list of numbers, a list of characters, and a list of of dates is (basically) programmed in the same way: the algorithms for insertion, search, and deletion always run the same way.
Thus it was desirable to make the implementation of e.g. lists independent of their types. Additional variables for types, so-called type variables were introduced. These type variables represent unknown types at the time of the implementation. Only with the use of the type, classes, interfaces, or methods, these type variables are replaced by specific types.
type Maybe<T> = T | void is an example for generics in TypeScript. Any type can be passed to
This way, abstracted but type-safe programming can be ensured.