У меня есть объект типа c.errors, который возвращается в конкретном случае:
{ required: true}
И я хочу сопоставить это с более общим (и фиксированным массивом)
validationMessages = {
required: 'Please enter',
pattern: 'Please enter valid'
}
У меня также есть свойство errorMessage, инициализированное пустой строкой . Моя попытка была:
this.errorMessage = Object.keys((c.errors).map(key => this.validationMessages[key]).join(' '));
Ошибки получаю:
Parameter 'key' implicitly has an 'any' type.
Element implicitly has an 'any' type because type '{ required: string; pattern: string; }' has no index signature.
Любой совет?
this.errorMessage должен содержать "Пожалуйста, введите" (это мое ожидание после сопоставления)
Если вы индексируете тип, у которого нет индексатора, машинописный текст ожидает, что индексируемая строка будет ключом типа. Это означает, что в вашем случае key
должен быть либо строковым литералом типа 'required'
, либо 'pattern'
. Поскольку Object.keys
возвращает массив strings
, если вы уверены, что этот массив будет содержать только действительные ключи для validationMessages
, вы можете просто использовать утверждение типа. Также у вас есть несоответствующие скобки:
this.errorMessage = Object.keys(c.errors).map((key) => this.validationMessages[key as 'required']).join(' ');
Вы бы посоветовали пройтись по существующему массиву ключей, чтобы увидеть, какая из них подходит или есть лучшая версия?
@annepic К сожалению, все методы перебора ключей объекта создают строку. (т.е. Object.keys
, for(let key in o)
, Object.entries
) Я не знаю способа сделать это без утверждения типа. Лучшее, что вы можете сделать, это создать свою собственную безопасную функцию keys
.
@annepic Что-то вроде function typedKeys<T>(o: T) : Array<keyof T> { return Object.keys(o) as Array<keyof T> } this.errorMessage = typedKeys(c.errors).map((key) => this.validationMessages[key]).join(' ');
Но даже эта ошибка будет нарушена, если будет набрано больше ошибок, чем просто required
, и вы все равно получите утверждение типа.
Большое спасибо Тициану. Однако я надеялся, что сопоставление будет более умным, чтобы распознавать совпадения ключей. В данном случае это был «обязательный», но в других случаях это мог быть «шаблон».