Как использовать дополнительный оператор цепочки с переменной в машинописном тексте - PullRequest
0 голосов
/ 01 августа 2020

У меня есть следующий код, и я хотел бы передать число из ключа значения объекта переменной. Как я могу использовать переменную для дополнительного оператора цепочки, чтобы он разрешил ошибку. Элемент неявно имеет тип any?

    function fun(i?: number) {
        console.log(i)
    }

    const variable = { min: { value: 1, name: 'google' }, max: {value: 2, name: 'apple'} }
    const variable2 = { min: { value: 1, name: 'google' } }
    const variable3 = { max: {value: 2, name: 'apple'} }

    fun(variable?.min.value) // working => 1
    fun(variable?.max.value) // working => 2
    fun(variable2?.min.value) // working => 1
    fun(variable2?.max.value) // working => undefined
    fun(variable3?.min.value) // working => undefined
    fun(variable3?.max.value) // working => 2

    Object.keys(variable).forEach((key) => {
        fun(variable?.[key]?.value) // working but with error Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ min: { value: number; name: string; }; max: { value: number; name: string; }; }'.
    })

1 Ответ

4 голосов
/ 01 августа 2020

На самом деле это не необязательная проблема связывания, а проблема того, как работает Object.keys. Typescript предполагает, что у объекта может быть больше ключей, чем известно во время компиляции , поэтому тип key здесь string, а не keyof variable. Чтобы обойти это, вы должны сообщить компилятору TS, что все ключи известны во время компиляции, используя

Object.keys(variable).forEach((key) => {
  fun(variable[key as keyof typeof variable].value) 
})

Вы уже рассматриваете variable как ненулевую переменную, когда вы ее используете. в Object.keys, поэтому нет необходимости дополнительно использовать для него необязательную цепочку. Кроме того, когда вы преобразовываете key в keyof typeof variable, вы утверждаете, что он уже существует, поэтому вы также можете удалить необязательную цепочку перед ?.value.

...