Я пытаюсь присвоить значение объекта типа 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.
Мне было интересно, является ли это ошибкой или как я могу сделать это правильно? Вот ссылка на Машинописная площадка.
Разве keyof TestInterface не эквивалентен только «testKey» и «optKey» и, следовательно, строке? Я не верю, что здесь дело в этом.
Истинный. Вы правы, это должна быть строка. Это может быть ошибка. Попробуйте открыть тикет в сообществе TypeScript. Потому что прямо сейчас Typescript дает ключу тип всех возможных значений возможных ключей. И тогда это конфликтует с методом объекта, о котором я упоминал.
Вам нужно добавить тип как -
const myTestKey: keyof TestInterface = 'testKey';
Однако это действительно решает пример - и я соответствующим образом отредактирую свой вопрос - в моем случае использования testKey
в присваивании фактически представляет собой просто значение типа string, поэтому я не могу ввести константу явно.
Мне удалось найти не слишком грязный обходной путь, который подходит для моего варианта использования. См. пример ниже:
//solution
myObj = {
...myObj,
[myTestKey]: myObj2[myTestKey]
}
Примечание: myObj
теперь let
вместо const
Вы можете передать строку только для получения определенного свойства. Вы не можете передать объект. Вот почему typescript показывает эту ошибку, потому что
keyof TestInterface
также может иметь типNestesOptInterface
и, очевидно, вы не можете передать объект как имя свойства. Однако странно то, что ошибка отображается только для назначенного объекта (левого), даже если вы измените это, назначенный объект получит только ошибку. Я ожидал увидеть ошибку на обоих из них.