Как выполнить цикл над объектом и присвоить значения с помощью for в цикле в машинописном тексте?

#typescript #typescript-typings

Вопрос:

Я хотел бы объединить два объекта в TypeScript и включить только те ключи, которые существуют в первом объекте

Ниже приведен мой код.

 type User = {
  username: string
  passcode: number;
}

const userA: User = {
  username: 'A',
  passcode: 1234
}

const updateValues = {
  username: 'B',
  unexpectedKey: "I shouldn't be here. But I exsits in users' post request"
}

// Update userA
for (const key in updateValues) {
  if (key in userA) {
    // We know that `key` has the type `keyof User` now
    userA[key] = updateValues[key]
  }
}
 

Но TypeScript сообщает о следующих ошибках.

 Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'User'.
  No index signature with a parameter of type 'string' was found on type 'User'.
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ username: string; unexpectedKey: string; }'.
  No index signature with a parameter of type 'string' was found on type '{ username: string; unexpectedKey: string; }'.
 

Как я могу исправить эти ошибки с помощью утверждения типа?

Ответ №1:

Вам необходимо объявить подпись индекса для пользователя вашего типа.

Вы можете прочитать более подробно здесь: Подписи индекса

 type User = {
  [username:string] : string | number;
  passcode: number;
}

type UserUpdated = {
  [username:string] : string;
  unexpectedKey: string;
}

const userA: User = {
  username: 'A',
  passcode: 1234
}

const updateValues: UserUpdated = {
  username: 'B',
  unexpectedKey: "I shouldn't be here. But I exsits in users' post request"
}

// Update userA
for (const key in updateValues) {
  if (key in userA) {
    // We know that `key` has the type `keyof User` now
    userA[key] = updateValues[key]
  }
}