Javascript 如果我添加PropTypes,是否需要检查typeof?
我有一个propJavascript 如果我添加PropTypes,是否需要检查typeof?,javascript,reactjs,react-proptypes,Javascript,Reactjs,React Proptypes,我有一个proponNotifyChange,它是一个函数,我在输入的onChange中调用它 它有一个用于func的PropType MyComponent.propTypes = { onNotifyChange: PropTypes.func, } 在调用NotifyChange时,我是否需要检查typeof const onChange = e => { // do some stuff if(onNotifyChange && typeo
onNotifyChange
,它是一个函数,我在输入的onChange
中调用它
它有一个用于func
的PropType
MyComponent.propTypes = {
onNotifyChange: PropTypes.func,
}
在调用NotifyChange时,我是否需要检查typeof
const onChange = e => {
// do some stuff
if(onNotifyChange && typeof onNotifyChange === 'function'){
onNotifyChange()
}
}
或者只是检查一下是不是falsy
const onChange = e => {
// do some stuff
if(onNotifyChange){
onNotifyChange()
}
}
Does
PropTypes.bar
无需检查foo==“bar”?取决于:通常,否;实际上。。。也许吧
类型检查(通常)不会发生在生产构建中。如果动态构造了类型可能无效的属性,则仍然需要某种形式的错误处理。来自
如果它们不匹配,则在开发中发出警告
所以道具类型
只“保护”你在开发时不出错。当代码运行时,它不会做任何事情(除了在控制台上抛出错误)
如果您需要硬类型检查,请使用。。。尽管这些都只是在开发+构建期间,所以。。。JS中没有任何东西可以在运行时保护您不受错误类型的影响(除了编写时的显式检查),因为它毕竟是一种弱类型语言。建议您定义defaultProps
MyComponent.defaultProps = {
onNotifyChange: () => false
}
这将解决您“忘记”传递onNotifyChange
的情况
如果不定义defaultProps,您将遇到
Uncaught TypeError: _this10.props.onNotifyChange is not a function
是的,即使在使用
道具类型时,您也需要检查道具类型。proptypes
库在React的开发模式下为您提供运行时警告
在下面的示例中,我们使用React的开发构建。我们有一个具有所需功能的组件H1
。请注意,在App
中使用H1
组件时,如果未传递className
prop的值,将抛出一个错误,并且prop types
记录了一个警告
因此,您不能依靠道具类型来防止不良道具传给儿童
函数H1({className,children}){
//如果className不是函数,则会引发此错误
返回{children}
}
H1.1类型={
类名:PropTypes.func.required
}
函数App(){
回归试验
}
ReactDOM.render(,document.querySelector(#root))
除了将一些警告记录到控制台之外,PropTypes是否真的在非prod版本中添加了任何保护?@Nick Define“protection”。它检查类型——它不是类型系统的替代品;这是一个开发辅助工具,用于警告一种类型的错误。我想我想说的是,使用typeof
保护应用程序中的代码可以防止错误,而我不认为使用PropTypes可以防止错误,除非您将控制台警告视为预防性警告,因为开发人员现在知道如何修复something@Nick当然,使用typeof
可以防止错误。关键是,在开发过程中更适合捕捉这种特定(ahem)类型的错误。如果有运行时类型错误,它几乎总是由(a)编程错误或(b)意外类型引起的。意外类型几乎总是应该在调用堆栈中的不同点进行处理。抛出错误通常会导致应用程序失败,只是以可控的方式。在生产代码中乱扔类型检查,这种检查在开发过程中几乎总是会被发现,这似乎有些过分——如果您根据属性类型抛出错误,那么您根本不需要道具类型;您只是在硬编码检查的基础上添加了另一个不太引人注意的机制。@DaveNewton我不是建议您在生产中抛出实际错误,只是在这里这样做是为了证明使用默认道具是有效的。我会在我的回答中明确这一点——谢谢你的提问。