Тип «строка» не может быть назначен типу keyof [Type]

Я надеюсь, что кто-то может помочь с этим. Я новичок в мире реагирования на машинописные тексты, и я написал дочерний компонент Textarea, который принимает функцию в качестве реквизита onChange. Затем эта функция вызывается с двумя строками в качестве аргументов из дочернего компонента.

В родительском компоненте я более конкретно знаю, как должен выглядеть второй аргумент этого вызова функции (keyof Type). Проблема в том, что машинописный текст говорит мне, что строка типа не может быть назначена типу [вставить строки ключей типа].

Я думаю, что это должно быть решено с помощью дженериков? но я просто не могу уложить это в голове.

Я попробовал этот как вы можете выразить «keyof T» как подмножество String?, но ошибка не исчезла.

Код Barebones можно найти здесь: https://codesandbox.io/s/modest-dhawan-v3z2y В этом примере первая и третья Textarea не должны выдавать никаких ошибок, так как второй аргумент будет ключом из указанного типа. То

Как я могу это решить?

Я хотел бы, чтобы оба компонента Textarea в index.tsx не выдавали никаких ошибок типа, еще раз я думаю, что дженерики могут быть решением, но я не могу понять это.

Спасибо заранее.

Нет необходимости ни в дженериках, ни во втором аргументе. Поскольку вы передаете значение этого аргумента в качестве реквизита, это предполагает, что вы уже знаете, какое значение будет в родительском компоненте.

Avin Kavish 04.06.2019 15:46

Проверь это. codeandbox.io/s/quizzical-darkness-79eux

Avin Kavish 04.06.2019 15:50

Не могу поверить, что я сам этого не понял. Это очень просто. Это решает проблему, большое спасибо.

Huuums 04.06.2019 16:06

Не беспокойтесь, я просто продвинул это в ответ, чтобы получить некоторые из этих сочных кармических штучек репутации.

Avin Kavish 04.06.2019 16:32
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
3
4
1 986
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нет необходимости ни в дженериках, ни во втором аргументе. Поскольку вы передаете значение этого аргумента в качестве реквизита, это предполагает, что вы уже знаете, какое значение будет в родительском компоненте. Вы можете передать лямбду или связанную функцию с уже установленным именем.

      <TextArea
        id = "ErrorDescription"
        name = "ErrorDescription"
        className = "form-control"
        isRequired
        value = {inputValues.ErrorDescription}
        onChange = {(value) => updateValue(value, 'ErrorDescription')}
      />

Или

// Note I had to swap the order of parameters to facilitate binding
const updateValue = (eventtargetname: keyof InputValues, eventvalue: string) => ...

const updateErrorValue = updateValue.bind(this, 'ErrorDescription')

return (
  ...
  <TextArea
        id = "ErrorDescription"
        name = "ErrorDescription"
        className = "form-control"
        isRequired
        value = {inputValues.ErrorDescription}
        onChange = {updateErrorValue}
  />
)

Лично я бы выбрал лямбды, так как они намного чище. Связанные функции работают лучше в компонентах класса, когда используются вне функции рендеринга, но это больше невозможно с парадигмой функций и хуков.

Рабочий пример. https://codesandbox.io/s/quizzical-darkness-79eux

Другие вопросы по теме