Если все, что вы хотите сделать, это получить уже существующие свойства интерфейса, вам не нужна подпись индекса.Вы можете индексировать любой объект с помощью строки, если строка является известным ключом объекта.Так что это работает:
myObj['bar'] // 'bar' can be checked as a key of MyInterface so it's ok
Проблема в том, что Object.keys(myObj)
возвращает string[]
, а не Array<keyof T>
.Самое простое решение - использовать утверждение типа, чтобы сообщить компилятору, что возвращаемое значение keys
является массивом ключей MyInterface
Object.keys(myObj).forEach(obj => {
let d = myObj[obj as keyof MyInterface];
});
// OR
(Object.keys(myObj) as Array<keyof MyInterface>).forEach(obj => {
let d = myObj[obj];
});
, или если вам удобна функция keys
всегдавернув Array<keyof T>
вы можете расширить глобальную декларацию
declare global { /// Needed if you are in a module otherwise omit this and the closing }
interface ObjectConstructor {
keys<T extends object>(o: T) : Array<keyof T>
}
}
// Now works without any extra casting
Object.keys(myObj).forEach(obj => {
let d = myObj[obj];
});