Pesquisa de site

Referências de tipo recursivo do TypeScript 3.7 - Record vs assinatura de índice


Eu tentei usar referências de tipos recursivos introduzidas no TypeScript 3.7 de uma forma muito semelhante ao que foi apresentado no exemplo oficial.

Eu fiz algo um pouco diferente do que foi apresentado na documentação, mas pensei que deveria funcionar da mesma maneira. Acontece que não funciona.

Usar assinatura de índice na recursão funciona conforme descrito na documentação:

type Json = string | number | boolean | null | Json[] | { [key: string]: Json; };

No entanto, usar o tipo Record não funciona - resulta em erro de referência circular

type Json = string | number | boolean | null | Json[] | Record<string, Json>;

E o que é ainda mais estranho para mim, expandir manualmente o tipo Record funciona bem:

type Json = string | number | boolean | null | Json[] | { [key in string]: Json; };

link do playground do TS

Perguntas: Qual é a diferença entre { [key: string]: X; } e Record<string, X> que causa a diferença com tipos recursivos? Record<K, V> não é equivalente a { [P in K]: V; }, ou seja, Record<string, X> === { [key in string]: X; }? Por que isso produz resultados diferentes com tipos recursivos? O que estou perdendo? Ou será um bug no TS?