Доступ к свойству объекта с помощью переменной в скобках в TypeScript - PullRequest
0 голосов
/ 19 июня 2020

У меня есть объект с интерфейсом, и я хотел бы динамически получать доступ к значениям по ключу свойства.

const tmpUser: IUser = {
    username: "test",
    namespace: "test",
    password: "test"
}

Object.keys(tmpUser).forEach(property=>{
    // Error: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'IUser'.
    console.log(tmpUser[property]);
})

// works
console.log(tmpUser["username"]);

// works
const someKey = "username";
console.log(tmpUser[someKey]);

также tmpUser.hasOwnProperty(property) тоже не помогает.

Ответы [ 3 ]

1 голос
/ 30 июня 2020

Вы можете указать, что ключи IUser будут иметь тип string (или, если хотите, например, string | number):

interface IUser extends Record<string, any> {
    username: string
    namespace: string
    password: string
}
1 голос
/ 30 июня 2020

Поскольку Object.keys не позволяет использовать для передачи обобщенного типа c, его возвращаемый тип - string[], если мы хотим иметь тип [keyof IUser], мы можем преобразовать его

const keys: [keyof IUser] = Object.keys(tmpUser) as [keyof IUser]
keys.forEach((property)=>{
    console.log(tmpUser[property]);
})

НО: Это не нужно. Если вы хотите получить ключ и значение этого ключа, вы можете просто использовать

Object.entries(tmpUser).forEach(([key,value])=>{
   
})
0 голосов
/ 30 июня 2020

Подбрасываем здесь другое решение, тем более что я предполагаю, что у вас будет какая-то функция process, которая принимает объект и что-то с ним делает:


const process = <O extends { [key: string]: any }>(object: O) => {
    Object
        .keys(object)
        .forEach(prop => {
            // No longer complains
            console.log(object[prop]);
        });
}

process(tmpUser);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...