Skip to content

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

Open

Description

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

Labels

In DiscussionNot yet reached consensusSuggestionAn idea for TypeScript

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions