-
Notifications
You must be signed in to change notification settings - Fork 13.2k
Open
Labels
Experience EnhancementNoncontroversial enhancementsNoncontroversial enhancementsSuggestionAn idea for TypeScriptAn idea for TypeScript
Milestone
Description
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
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
Experience EnhancementNoncontroversial enhancementsNoncontroversial enhancementsSuggestionAn idea for TypeScriptAn idea for TypeScript