function isPropTypesUsageByMemberExpression(context, node, utils, checkAsyncSafeLifeCycles) {
  const unwrappedObjectNode = astUtil.unwrapTSAsExpression(node.object);

  if (isInClassComponent(context, node)) {
    // this.props.*
    if (isThisDotProps(unwrappedObjectNode)) {
      return true;
    }
    // props.* or prevProps.* or nextProps.*
    if (
      isCommonVariableNameForProps(unwrappedObjectNode.name)
      && (inLifeCycleMethod(context, node, checkAsyncSafeLifeCycles) || astUtil.inConstructor(context, node))
    ) {
      return true;
    }
    // this.setState((_, props) => props.*))
    if (isPropArgumentInSetStateUpdater(context, node, unwrappedObjectNode.name)) {
      return true;
    }
    return false;
  }
  // props.* in function component
  return unwrappedObjectNode.name === 'props' && !astUtil.isAssignmentLHS(node);
}
Checks if the node is a propTypes usage of the form `this.props.*`, `props.*`, `prevProps.*`, or `nextProps.*`.
@param {Context} context
@param {ASTNode} node
@param {Object} utils
@param {boolean} checkAsyncSafeLifeCycles
@returns {boolean}