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检查失败。
2条答案
按热度按时间lnxxn5zx1#
在这里发布一个过度属性错误是误导性的,因为这里没有任何字面值可以写入,以满足要求。这个错误应该是表达式上的顶级错误,表明关于这个值不可分配给目标的更一般的情况。
smdncfj32#
当未为类使用Map类型时,
MainClassOK
是OK的。需要使用的场景(
MainClassOK
不满足):