Búsqueda de sitios web

javascript - Typescript acceder y asignar propiedad de objeto por clave dinámica


Estoy tratando de asignar un valor de un objeto de tipo TestInterface a otro objeto de tipo TestInterface accediéndolo con una clave dinámica de tipo keyof TestInterface. Sin embargo, TypeScript parece olvidar que esta clave es la misma en ambas instancias y por lo tanto lanza un error.

Dado que esta frase es difícil de leer, aquí hay un ejemplo:

interface TestInterface {
    testKey?: NestesOptInterface;
    optKey?: string;
}

interface NestesOptInterface {
    key1?: string;
    key2?: string
}

const myObj : TestInterface= {

}

const myObj2 : TestInterface = {
    testKey: {
        key1: "test",
    }
}

const attributes : string[] = ['testKey', 'optKey']

const myTestKey: keyof TestInterface = attributes[0] as keyof TestInterface

/**Type 'string | NestesOptInterface | undefined' is not assignable to type '(NestesOptInterface & string) | undefined'.
 * Type 'NestesOptInterface' is not assignable to type 'NestesOptInterface & string'.
 * Type 'NestesOptInterface' is not assignable to type 'string'.(2322)**/
myObj[myTestKey] = myObj2[myTestKey]

//does work (obviously)
myObj['testKey'] = myObj2['testKey']

La parte complicada es que testKey en la asignación de myTestKey debería ser en realidad cualquier valor de tipo cadena.

Me preguntaba si esto es un error o cómo puedo hacer esto correctamente. Aquí está el enlace al Playground de Typescript.

Respuesta #1

Logré encontrar una solución alternativa no demasiado sucia que funciona para mi caso de uso. Véase el ejemplo a continuación:

//solution
myObj = {
    ...myObj,
    [myTestKey]: myObj2[myTestKey]
}

Nota: myObj ahora es let en lugar de const

Área de juego de Typescript

Respuesta #2

Necesitas añadir el tipo como -

const myTestKey: keyof TestInterface = 'testKey';

Parque infantil

Artículos relacionados