microsoft/TypeScript

Cannot describe recursive type aliases like JSON in terms of generic mapped types

DanielRosenwasser opened this issue · 1 comments

In the following examples, I've defined 4 different versions of a Json type, where they differ on their description of object types.

Playground link here.

In the first two, I've defined them in terms of mapped types with a concrete key of string, and an object type with a string index signature. TypeScript has no issues with either of those.

On the other hand, the last two are described with Record, or with a helper mapped type fed in a string key type.

// No errors ✅
namespace ObjectIsMappedTypeOnString {
    export type Json =
        | string
        | number
        | boolean
        | null
        | Json[]
        | { [K in string]: Json }
        ;
}

// No errors ✅
namespace ObjectIsIndexSignature {
    export type Json =
        | string
        | number
        | boolean
        | null
        | Json[]
        | { [key: string]: Json }
        ;
}

// Errors ❌
namespace ObjectIsRecord {
    export type Json =
        | string
        | number
        | boolean
        | null
        | Json[]
        | Record<string, Json>
        ;
}

// Error ❌
namespace ObjectIsGenericMappedType {
    type JsonProperties<K extends PropertyKey> = {
        [P in K]: Json
    };
    export type Json =
        | string
        | number
        | boolean
        | null
        | Json[]
        | JsonProperties<Json>
        ;
}

I would expect all of these to work.

jcalz commented

… uh, duplicate #41164?