Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果我添加PropTypes,是否需要检查typeof?_Javascript_Reactjs_React Proptypes - Fatal编程技术网

Javascript 如果我添加PropTypes,是否需要检查typeof?

Javascript 如果我添加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

我有一个prop
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我不是建议您在生产中抛出实际错误,只是在这里这样做是为了证明使用默认道具是有效的。我会在我的回答中明确这一点——谢谢你的提问。