Estoy creando una función genérica que permitirá actualizar las propiedades de los objetos anidados (idealmente en función del tipo inferido, pero es bueno tenerlo en lugar de un requisito).
Además de eso, tenga en cuenta: no soy un experto en mecanografiado, por lo que me complacería señalar cualquier error.
Así que aquí está el estado de ejemplo + tipos para ello:
type DataType = { knownKeyName1: { knownNestedKeyName1: string knownNestedKeyName2: string knownNestedKeyName3: string knownNestedKeyName4: string } knownKeyName2: { knownNestedKeyName1: string knownNestedKeyName2: string knownNestedKeyName3: string } } type SomeState = { data: DataType } const someState: SomeState = { data: { knownKeyName1: { knownNestedKeyName1: 'value', knownNestedKeyName2: 'value', knownNestedKeyName3: 'value', knownNestedKeyName4: 'value' }, knownKeyName2: { knownNestedKeyName1: 'value', knownNestedKeyName2: 'value', knownNestedKeyName3: 'value' } } }Y debajo está la función que ya intenté construir con los genéricos de Typescript:
const setStateValue = < State extends { data: unknown }, // I want this to infer type from `someState` variable whenever I pass it to this function Prop extends [keyof State['data']], VarName extends keyof State['data'][Prop] // Type 'Prop' cannot be used to index type 'State["data"]'.ts(2536) >( state: State, prop: Prop, varName: VarName, newValue: string ): void => { state.data[prop][varName] = newValue // Example usage should results with: // state.data[knownKeyName1][knownNestedKeyName3] = 'someNewValue' }Equivalente de JavaScript:
const setStateValue = (state, prop, varName, newValue) => { state.data[prop][varName] = newValue // Object property reassignment is done on purpose because we want to update the state in reducer with `immer` }¿Algunas ideas? Además, si eso no es posible, sería bueno tener al menos algo como esto:
const setStateValue = < State extends { data: DataType }, Prop extends keyof DataType, VarName extends keyof DataType[Prop] >( state: State, prop: Prop, varName: VarName, newValue: string ): void => { state.data[prop][varName] = newValue // but then this error pops out: // Type 'string' is not assignable to type 'DataType[Prop][VarName]'.ts(2322) }¡Gracias por adelantado!
PD Agregando la etiqueta #redux-toolkit para dar un poco de contexto de uso, ya que quiero usar esta función setStateValue dentro del reductor genérico (para que el estado se pueda mutar con immer).