Suppose I have a generic utility class that is supposed to interface with a class and has a method setPropertiesToTrue that takes in a list of class properties, and sets those properties inside the instance of the class to true.
class SomeObject{
x: boolean
y: boolean
z: string
constructor(x: boolean,y: boolean,z: string){
this.x = x,
this.y = y,
this.z = z
}
}
class ProperySetter<TSomeObject>{
objectContext: TSomeObject
constructor(objectContext: TSomeObject){
this.objectContext = objectContext
}
setPropertiesToTrue(properties: Array<keyof TSomeObject>){
properties.forEach(property => {
this.objectContext[property] = true
})
}
}
const someObject = new SomeObject(false, false, "hello")
const propertySetter = new ProperySetter(someObject);
propertySetter.setPropertiesToTrue(["x", "y"])
console.log(someObject.x) // changed from false to true
console.log(someObject.y) // changed from false to true
console.log(someObject.z) // unchanged
HereHere is a TS Playground example of more or less what I'm trying to do.
In the example above, (at line 22 in the playground), it appears typescript has no the idea that keys being passed as properties correspond to boolean values inside the generic TSomeObject
. So I’m getting the error:
Type 'boolean' is not assignable to type 'TSomeObject[keyof TSomeObject]'.
And this makes sense because keyof TSomeObject
correspond to all keys of TSomeObject not just the keys corresponding to the boolean keys.
Is there a way to get around this?