镜像站点 · 本页由第三方 GitHub 只读镜像提供,非 GitHub 官方站点,不接受任何登录或凭据输入。前往 github.com
Skip to content

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

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.

Metadata

Metadata

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