代码之家  ›  专栏  ›  技术社区  ›  Asik

这是类型注释、对象还是其他什么?

  •  2
  • Asik  · 技术社区  · 6 年前

    我在看 this code example 偶然发现了这种语法:

    import React, { Component } from 'react';
    
    const PrivateRoute = ({component:Component, ...rest}) => (
    //(...)
      <Component {...props} />
    // (...)
    );
    

    我很困惑 :Component 部分。这看起来像一个静态类型的注释,并且有点像一个普通的注释,但是这是一个JavaScript,所以它只能是一个对象,对吗?如果这是一个对象,这是否意味着函数正在将一个默认的空组件对象分配给它自己的参数?如果是这样,它如何能够从调用者接收它,例如(根据示例):

    <PrivateRoute path="/protected" component={Protected} />
    
    2 回复  |  直到 6 年前
        1
  •  5
  •   Giorgi Moniava    6 年前

    这是命名对象 destructuring 从ES6。下面

    const PrivateRoute = ({component:Component, ...rest}) => (
    

    意味着一切都将传递给 PrivateRoute 作为 component 属性,可以使用 Component 变量。

        2
  •  1
  •   Jonas Wilms    6 年前

    我对:组件部分感到困惑。这看起来像静态类型批注

    是吗? 看起来像 因为全球 Component 类被隐藏,因此看起来 component 使用typescript注释作为 成分 . 但是,在typescript中,类型将遵循对象文本,因此它是:

     ({ component: Component, ...rest }: { component: Component, rest: any })
    

    所以实际上第一个 成分 是被破坏变量的名称,而第二个 成分 类型 成分 作为一个组件。我会明确地将内部变量重命名为更有意义的内容,以防止隐藏:

     ({ component: ChildComponent, ...rest }) => (
       //...
       <ChildComponent {...props} />
    )
    

    这等于:

     props => {
      const ChildComponent = props.component,
          rest = props;
    
      return <ChildComponent {...rest}/>
     };
    

    如果这是一个对象,这是否意味着函数正在将一个默认的空组件对象分配给它自己的参数?

    不,默认值将跟随 = 例如。:

     ({ component: ChildComponent = DefaultComponent, ...rest }) =>