如何理解类型... args:any [])=>任何

时间:2018-06-06 17:33:16

标签: javascript typescript validation instanceof

我正在阅读class-validator库的代码,其中包含以下isInstance方法:

/**
 * Checks if the value is an instance of the specified object.
 */
isInstance(object: any, targetTypeConstructor: new (...args: any[]) => any) {
    return targetTypeConstructor
        && typeof targetTypeConstructor === "function"
        && object instanceof targetTypeConstructor;
}

有关如何理解类型new (...args: any[]) => any的任何想法?这是我第一次看到这种类型的构造......

4 个答案:

答案 0 :(得分:2)

让我们将类型缩小为更容易理解的更小,更小的部分,然后重新构建完整的东西。

首先,让我们放弃new,并专注于定义的后半部分:

  

(...args: any[]) => any

接下来让我们忘记现在的论点:

  

() => any

希望这是一个熟悉的函数,它返回类型any

接下来我们可以在args中添加:

  

(...args: any[]) => any

...args: any[]正在使用Rest Parameters构造,它实质上表示所提供类型any可以包含任意数量的参数。因为有any个参数未知,所以参数的类型是any的数组。

所以希望现在有意义的是,这是一个接受任意数量的参数(类型为any)并返回类型any的函数。

最后,我们可以添加new关键字来获取:

  

new (...args: any[]) => any

此处的new关键字指定可以将此函数视为类构造函数,并使用new关键字进行调用。

这给了我们整个画面,函数是一个接受任何数量的参数(类型any)的函数,它返回类型any并且可以用作构造函数new关键字

在API的上下文中,它基本上允许您将任何类构造函数传递给函数。

答案 1 :(得分:1)

new (...args: any[]) => any

此类型指定一个函数,该函数接受any类型的任意数量的参数,返回any值,并且可以使用new调用。

构造函数是一种特殊类型的函数,它在运行时使用new关键字强制执行调用,但在TypeScript中,可以静态检测,因此targetTypeConstructor指定任意构造函数作为第二个参数到isInstance()

为此,检查

似乎是多余的
typeof targetTypeConstructor === "function"

因为targetTypeConstructor : new (...args: any[]) => any已经在编译时由TypeScript强制执行。

如果传递的值为null,则targetTypeConstructor && ...条件已使其无效,运行时 必须以防止object instanceof targetTypeConstructor抛出TypeError 1}}如果targetTypeConstructor由于步骤4而实际为null§12.10.4 of the ECMAScript Specification中:

  

12.10.4运行时语义:InstanceofOperator( V 目标

     
      
  1. 如果Type( target )不是Object,则抛出 TypeError 异常。
  2.   
  3. instOfHandler 成为? GetMethod( target ,@@ hasInstance)。
  4.   
  5. 如果 instOfHandler 不是未定义,那么

         

    一个。返回ToBoolean(?调用( instOfHandler 目标,« V »))。

  6.   
  7. 如果IsCallable( target false ,则抛出 TypeError 异常。
  8.   
  9. 回来? OrdinaryHasInstance( target V )。
  10.         
        

    请注意

             

    步骤4和5提供了与之前版本的ECMAScript的兼容性,这些版本没有使用@@ hasInstance方法来定义 instanceof 运算符语义。如果对象没有定义或继承@@ hasInstance,则它使用默认的 instanceof 语义。

      

答案 2 :(得分:1)

表示参数targetTypeConstructor是一个接受参数的函数,可以用作构造函数(您可以使用new关键字并创建实例)。您可以传递一个简单的函数或不是摘要的类。

您可以查看Typescript Playground

中的示例

答案 3 :(得分:1)

将其分解成碎片:

<强> new
TypeScript中的此关键字指定给定属性的构造函数应该是什么样的。这里有很好的解释:https://stackoverflow.com/a/39623422/1678614

<强> (...args: any[]) => any
此语法描述了一个函数类型(构造函数是一个函数)。暂时忽略......部分。

<强> ...
是ES6传播运营商。它是一个一个一个地列出所有数组元素的简写。

<强> any[]
意味着args是一个数组,它的元素可以是任何类型。

<强> => any
指定函数的返回类型。在这种情况下,它允许构造函数返回任何类型。