Skip to content

Type constraint checked fail when class mapped type defined by own member keyΒ #49571

@Bacra

Description

@Bacra

Bug Report

πŸ”Ž Search Terms

class mapped type

πŸ•— Version & Regression Information

4.8.0-dev.20220615

⏯ Playground Link

Playground link with relevant code

πŸ’» Code

const SubKeys = ['key1', 'key2'] as const

abstract class SubClass {
  public readonly Keys: typeof SubKeys = SubKeys
  setValue(obj: { [x in this['Keys'][number]]: number }) {
    console.log(obj)
  }
  setValue2(obj: { [x in typeof SubKeys[number]]: number }) {
    console.log(obj)
  }
}

abstract class MainClass<T extends SubClass> {
  protected abstract SubClass: { new(): T }
  protected get subInterface(): T {
    return new this.SubClass()
  }
}

abstract class MainClassError<T extends SubClass> extends MainClass<T> {
  protected setValue() {
    this.subInterface.setValue({
      //  ❌ check fail
      // Argument of type '{ key1: number; key2: number; }' is not assignable to parameter of type '{ [x in T["Keys"][number]]: number; }'.
      // Object literal may only specify known properties, and 'key1' does not exist in type '{ [x in T["Keys"][number]]: number; }'.
      key1: 1,
      key2: 2,
    })

    this.subInterface.setValue2({
      // βœ”οΈ check success
      key1: 1,
      key2: 2,
    })
  }
}

abstract class MainClassOK extends MainClass<SubClass> {
  protected setValue() {
    this.subInterface.setValue({
      // βœ”οΈ check success
      key1: 1,
      key2: 2,
    })

    this.subInterface.setValue2({
      // βœ”οΈ check success
      key1: 1,
      key2: 2,
    })
  }
}

πŸ™ Actual behavior

Func setValue of MainClassError check failed when the param defined by class member key.

πŸ™‚ Expected behavior

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions