TypeScript 当类Map类型由自己的成员键定义时,类型约束检查失败,

n53p2ov0  于 6个月前  发布在  TypeScript
关注(0)|答案(2)|浏览(56)

Bug报告

🔎 搜索词

classMap类型

🕗 版本与回归信息

4.8.0-dev.20220615

⏯ Playground链接

带有相关代码的Playground链接

💻 代码

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,
    })
  }
}

🙁 实际行为

当参数由类成员键定义时,MainClassError检查失败。

🙂 预期行为

lnxxn5zx

lnxxn5zx1#

在这里发布一个过度属性错误是误导性的,因为这里没有任何字面值可以写入,以满足要求。这个错误应该是表达式上的顶级错误,表明关于这个值不可分配给目标的更一般的情况。

smdncfj3

smdncfj32#

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,
    })
  }
}

当未为类使用Map类型时,MainClassOK 是OK的。

需要使用的场景( MainClassOK 不满足):

abstract class SubClassB extends SubClass {}
abstract class MainClassErrorB<T extends SubClassB> extends MainClassError<T> {}

相关问题