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"}
];
Ответы
Ответ 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