Вы можете расширить интерфейс, добавив подпись индекса для повторения при необходимости:
interface IterableRegisterData extends RegisterData {
[key: string]: string | undefined
}
const iterableRegisterData = registerData as IterableRegisterData;
for(const itemId in iterableRegisterData) {
if(itemId !== "password" && iterableRegisterData[itemId]) {
nonEmptyData[itemId] = iterableRegisterData[itemId];
}
}
Если вам не нужно изменять registerData
внутри цикла, вы можете добавить readonly к сигнатуре индекса, чтобы предотвратить добавление новых свойств в iterableRegisterData
:
interface IterableRegisterData extends RegisterData {
readonly [key: string]: string | undefined
}
Оригинальный ответ (плохая практика)
Просто добавьте подпись индекса:
export interface RegisterData {
email: string
password: string
firstName?: string
lastName?: string
[key: string]: string | undefined
}
Обратите внимание, что вы должны использовать тип объединения, потому что некоторые из ваших свойств могут быть неопределенными. Если вы добавляете больше свойств с разными типами, вы должны добавить эти типы в подпись индекса:
export interface RegisterData {
email: string
age: number
name?: string
data: AdditionalData
[key: string]: string | number | AdditionalData | undefined
}
Внимание
Как указано в комментариях, это может быть плохой практикой, поскольку добавление подписи индекса позволит вам добавить новые свойства, не определенные в интерфейсе, и, вероятно, вы не захотите этого:
const userData: RegisterData = {
email: 'user@domain.com,
password: '1234'
}
userData['foo'] = 'baz'