Доступ к объекту с помощью индекса в .find () в Typescript - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь получить доступ к объекту, используя индексную запись в машинописи. Но я не могу найти способ сохранить мои типы (без использования).

В машинописи я получаю следующую ошибку (строгий режим):

Элемент неявно имеет '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" '

Я могу взломать его, используя любой, но я не могу найти безопасный способ решить эту проблему.

1 Ответ

1 голос
/ 03 мая 2020

Сделайте это следующим образом

const match = (['givenName', 'familyName', 'email'] as const).find(e => 
    !!user[e] && user[e].toLowerCase().includes('searchQuery')
)

Затем массив печатается как массив объединений литералов, а не только как string[], а e правильно печатается как объединение литералов соответственно .

Ссылки:

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