Skip to content

Generic indexed access on a substitution type with an array constraint resolves incorrectlyΒ #55383

Open
@Andarist

Description

@Andarist

πŸ”Ž Search Terms

indexed access substitution type array constraint

πŸ•— Version & Regression Information

  • This is the behavior in every version I tried

⏯ Playground Link

https://www.typescriptlang.org/play?#code/C4TwDgpgBAMglsCAnAhgGwCrmgXigZ2CTgDsBzKAHyhIFcBbAI2SqkYHt20IUSBuAFChIUAGrpaEAOIRgiJAB5xaSVhEQAHohIATfLATJ0a3AfnHsAPih4AFAEob15auyCh2KAGUAxgAsIehQbb39AlABBJFQQVl8AoIB5RgArCB9gVnhzTDcPEXjwqJiQ4pQQBUKk1PTM6irI6PKsw1RcyEtBYWgG5LSMkIBvASgoAG0AawgQAC4CIlIyAF053pqB+rCgstjqbKN2iEEAX3duqABJEgAzZBcIfAAxJHZ6BsqoTW09UISUazwXk+Wggun0+zaJhGUAA-GIJNJZPJKpZoatgd99A0dtC4cNRgTxgBpKCkKBTEDsa7eFaXG53BFPF5vLYoSpjIlLTrQ0bHNHeDGgn5rfrAXFQfGE4mkkjk6ZUmlzK63JD3Jmvd5eDlcwSEvmjOYkCAAN2QgiAA

πŸ’» Code

type LiteralType = string | number | boolean;
type ValueGetter<ValueType extends LiteralType = LiteralType> = () => ValueType;

type Schema = SchemaArray | SchemaObject | LiteralType;
type SchemaArray = Array<SchemaObject | SchemaArray | LiteralType>;
type SchemaObject = {
  [key: string]: SchemaObject | SchemaArray | LiteralType;
};

type InferValuesFromSchema<S extends Schema> = S extends LiteralType
  ? ValueGetter<S>
  : S extends SchemaArray
  ? {
      [K in keyof S]: InferValuesFromSchema<S[K]>;
    }
  : S extends SchemaObject
  ? {
      [K in keyof S]: InferValuesFromSchema<S[K]>;
    }
  : never;

πŸ™ Actual behavior

an error is reported:

Type 'S[K]' does not satisfy the constraint 'Schema'.
  Type 'S[keyof S]' is not assignable to type 'Schema'.
    Type 'S[string] | S[number] | S[symbol]' is not assignable to type 'Schema'.
      Type 'S[string]' is not assignable to type 'Schema'.
        Type 'S[string]' is not assignable to type 'SchemaObject'.
          Type 'S[keyof S]' is not assignable to type 'SchemaObject'.
            Type 'S[K]' is not assignable to type 'SchemaObject'.
              Type 'S[keyof S]' is not assignable to type 'SchemaObject'.
                Type 'S[string] | S[number] | S[symbol]' is not assignable to type 'SchemaObject'.
                  Type 'S[string]' is not assignable to type 'SchemaObject'.(2344)

πŸ™‚ Expected behavior

There should be no error, S[K] should satisfy Schema constraint (at least since #48837 )

Additional information about the issue

A variant with an additional type alias for that array branch works OK: TS playground.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Possible ImprovementThe current behavior isn't wrong, but it's possible to see that it might be better in some cases

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions