https://blog.ean.studio/posts/typescript-variance-complete-guide/