#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]
}
}