Подтвердить что ты не робот

React: checker не является функцией

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

Предупреждение: сбой propType: checker не является функцией. Проверьте метод рендеринга Chart.

У меня вообще нет метода проверки. Если я удалю свой propTypes, предупреждение исчезнет. Любые идеи?

Мой компонент реакции:

var Chart = React.createClass({
  //...
  propTypes: {
    legend: React.PropTypes.bool,
    max: React.PropTypes.number,
    min: React.PropTypes.number,
    series: React.PropTypes.arrayOf(
      React.PropTypes.shape({
        label: React.PropTypes.string,
        values: React.PropTypes.arrayOf(
          React.PropTypes.arrayOf(
            React.PropTypes.oneOfType(
              React.PropTypes.number,
              React.PropTypes.object // Date
            )
          )
        ),
        colorIndex: React.PropTypes.string
      })
    ).isRequired,
    threshold: React.PropTypes.number,
    type: React.PropTypes.oneOf(['line', 'bar', 'area']),
    units: React.PropTypes.string,
    xAxis: React.PropTypes.arrayOf(React.PropTypes.string)
  },
  render: function() {
    return (<svg>...</svg>);
  }
  //...
});

Полезная нагрузка, которую я отправляю компоненту Chart, такова:

var series = [
  {label: 'first', values: [[5,2], [4,3], [3,3], [2,2], [1,1]], colorIndex: "graph-1"},
  {label: 'second', values: [[5,3], [4,2], [3,0], [2,0], [1,0]], colorIndex: "graph-2"}
];
4b9b3361

Ответ 1

Запрос на перенос был объединен с репо React, который обеспечивает лучшую обратную связь для разработчика всякий раз, когда такая ошибка повторяется снова.

Теперь сообщение проверки будет выглядеть следующим образом:

Недопустимый аргумент, предоставленный oneOf, ожидаемый экземпляр массива.

https://github.com/facebook/react/pull/3963

Это должно быть частью React 0.14.

Ответ 2

В моем случае я получил это, когда использовал функцию формы со сложным объектом. Решение заключалось в том, чтобы перейти от:

outerObject: shape({
  firstInnerObject: {
    a: string,
    b: string,
  },
  secondInnerObject: {
    a: string,
    b: number,
  },
}),

To:

outerObject: shape({
  firstInnerObejct: shape({
    a: string,
    b: string,
  }),
  secondInnerObject: shape({
    a: string,
    b: number,
  }),
}),

Очень тривиально, я знаю, но это может быть решением для кого-то столь же неопытного, как и я.;)

Ответ 3

Изменить

React.PropTypes.oneOfType(React.PropTypes.number, React.PropTypes.object)

к

React.PropTypes.oneOfType([React.PropTypes.number, React.PropTypes.object])

(аргумент должен быть массивом)

Ответ 4

FWIW, я получал Failed PropType: typeChecker is not a function. Я заметил, что в моих свойствах PropTypes.arrayOf() я проходил объект PropTypes, например. PropTypes.arrayOf({}) вместо передачи в PropTypes.shape(), например. PropTypes.arrayOf(PropTypes.shape({})

Выполнение этого изменения устранило сообщение об ошибке.

Ответ 5

Моя версия Warning: Failed propType: checker is not a function произошла от забывания использовать PropTypes.shape для объекта.

Изменение:

someProps: {
    prop: React.PropTypes.string,
    anotherProp: React.PropTypes.number,
}

к этому исправлена ​​проблема:

someProps: React.PropTypes.shape({
    prop: React.PropTypes.string,
    anotherProp: React.PropTypes.number,
})

Ответ 6

Реальное объяснение позади этого вопроса является то, что реагировать ожидает PropType, которая технически является функцией, иначе проверки. Примеры функций проверки:

PropTypes.array
PropTypes.shape({...})
PropTypes.bool

У вас есть идея... Так что здесь происходит, когда вы передаете что-то, что не является проверкой, например, undefined, реакция не будет знать, что с этим делать, и поэтому будет жаловаться:

проверка не является функцией

В моем случае причина была в неправильном написании функций проверки:

PropTypes.shape({
    cats: PropTypes.Array // this is undefined
})

Правильная версия должна быть:

PropTypes.shape({
    cats: PropTypes.array // lowercase is correct!
})

Ответ 7

Я тоже получил эту ошибку при размещении проптипов в неправильном формате:

static propTypes = {
  workHard: PropTypes.func.isRequired,
  winBig: PropTypes.shape({
    prize: { // issue
      PENDING: PropTypes.bool,
    },
  }),
};

Оказывается, ожидается, что типы prop будут иметь тип PropTypes.shape или PropTypes.objectOf когда дело доходит до объявления реквизитов object

Итак, ошибка была исправлена при изменении кода на это:

static propTypes = {
  workHard: PropTypes.func.isRequired,
  winBig: PropTypes.shape({
    prize: PropTypes.shape({
      SUCCESS: PropTypes.bool,
    }),
  }),
};

Ответ 8

Reactv16

В моей версии этой ошибки у меня был массив объектов:

data: PropTypes.shape([{
  id: PropTypes.number,
  ...
}])

Решением было создать массив форм, например:

data: PropTypes.arrayOf(
  PropTypes.shape({
    id: PropTypes.number,
    ...
  })
)

Ответ 9

Я использовал oneOfType с массивом строк в качестве аргумента, когда на самом деле я намеревался использовать oneOf.

Что-то вроде этого:

// Wrong!
PropTypes.oneOfType(['s', 'm'])

// Right!
PropTypes.oneOf(['s', 'm'])

Ответ 10

Еще один для удовольствия :) В моем случае я извлек регулярно используемые модели в отдельные файлы и импортировал их. Итак, определение проптипа выглядело примерно так:

 static propTypes = {
        ...
        selectedAction: shape(ACTION),
        ...
};

Моя ошибка заключалась в том, что я написал дополнительную фигурку в форме:

static propTypes = {
        ...
        selectedAction: shape({ACTION}),
        ...
};

Ответ 11

В моем случае я просто случайно удалил тип:

grValue: PropTypes, // instead of PropTypes.string