Доступ к машинописному тексту и присвоение свойства объекта с помощью динамического ключа

Я пытаюсь присвоить значение объекта типа TestInterface другому объекту типа TestInterface, обратившись к нему с помощью динамического ключа типа keyof TestInterface. Однако typescript, похоже, забывает, что этот ключ одинаков в обоих экземплярах, и поэтому выдает ошибку.

Поскольку это предложение трудно читать, вот пример:

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']

Сложность заключается в том, что testKey в присваивании myTestKey на самом деле должно быть любым значением типа string.

Мне было интересно, является ли это ошибкой или как я могу сделать это правильно? Вот ссылка на Машинописная площадка.

Вы можете передать строку только для получения определенного свойства. Вы не можете передать объект. Вот почему typescript показывает эту ошибку, потому что keyof TestInterface также может иметь тип NestesOptInterface и, очевидно, вы не можете передать объект как имя свойства. Однако странно то, что ошибка отображается только для назначенного объекта (левого), даже если вы измените это, назначенный объект получит только ошибку. Я ожидал увидеть ошибку на обоих из них.

MrJami 06.05.2022 12:52

Разве keyof TestInterface не эквивалентен только «testKey» и «optKey» и, следовательно, строке? Я не верю, что здесь дело в этом.

Robert Haslinger 06.05.2022 13:11

Истинный. Вы правы, это должна быть строка. Это может быть ошибка. Попробуйте открыть тикет в сообществе TypeScript. Потому что прямо сейчас Typescript дает ключу тип всех возможных значений возможных ключей. И тогда это конфликтует с методом объекта, о котором я упоминал.

MrJami 06.05.2022 16:00
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
3
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам нужно добавить тип как -

const myTestKey: keyof TestInterface = 'testKey';

Детская площадка

Однако это действительно решает пример - и я соответствующим образом отредактирую свой вопрос - в моем случае использования testKey в присваивании фактически представляет собой просто значение типа string, поэтому я не могу ввести константу явно.

Robert Haslinger 06.05.2022 13:55
Ответ принят как подходящий

Мне удалось найти не слишком грязный обходной путь, который подходит для моего варианта использования. См. пример ниже:

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

Примечание: myObj теперь let вместо const

Машинописная площадка

Другие вопросы по теме