https://blog.stackademic.com/mastering-typescript-generics-the-ultimate-guide-to-flexible-and-reusable-code-596fbec43fdc