Я пытаюсь получить доступ к объекту, используя индексную запись в машинописи. Но я не могу найти способ сохранить мои типы (без использования).
В машинописи я получаю следующую ошибку (строгий режим):
Элемент неявно имеет 'any' тип, потому что выражение типа 'строка' не может быть использовано для индексации типа '{данное имя: строка; familyName: строка; электронная почта: строка; активный: логический; } '.
Не найдена подпись индекса с параметром типа' строка 'для типа' {данное имя: строка; familyName: строка; электронная почта: строка; активный: логический; } '.
// Example document
interface user {
givenName: string
familyName: string
email: string
active: boolean
}
const user:user = {
givenName: 'Max',
familyName: 'Maier',
email: 'max.maier@example.com',
active: true,
}
// To be used like this
const match = ['givenName', 'familyName', 'email'].find(e =>
!!user[e] && user[e].toLowerCase().includes('searchQuery')
)
при использовании строки stati c ошибок нет.
!!user['givenName'] && user['givenName'].toLowerCase().includes('searchQuery')
Определение индексатора, кажется, всегда бросает меня в проблему потери Тип безопасности. Например,
[index: string]: string | boolean | undefined
выдаст ошибку с .toLowerCase()
. Я мог бы исправить это, используя any
, но это не то, что я хочу.
На мой взгляд, лучшим решением было бы заставить машинопись понять, что e
- это существующий индекс с чем-то вроде этого:
['givenName', 'familyName', 'email'].find((e:'givenName'| 'familyName'| 'email' ) =>
Но мне не удалось получить ошибку:
Тип 'string' не может быть назначен типу 'GivenName' | "familyName" | "email" '
Я могу взломать его, используя любой, но я не могу найти безопасный способ решить эту проблему.