Javascript 如何理解类型`new(…args:any[])=>;任何`

Javascript 如何理解类型`new(…args:any[])=>;任何`,javascript,typescript,validation,instanceof,Javascript,Typescript,Validation,Instanceof,我正在阅读库的代码,其中包含以下isInstance方法: /** * Checks if the value is an instance of the specified object. */ isInstance(object: any, targetTypeConstructor: new (...args: any[]) => any) { return targetTypeConstructor && typeof targetTyp

我正在阅读库的代码,其中包含以下
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
有什么想法吗?这是我第一次看到这种结构

new (...args: any[]) => any
此类型指定一个函数,该函数接受任意数量的
any
类型的参数,返回
any
值,并可使用
new
调用

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

为此,检查似乎是多余的

typeof targetTypeConstructor === "function"
正如编译时通过TypeScript由
targetTypeConstructor:new(…args:any[])=>any
强制执行的那样

如果传递的值为
null
,则它已被
targetTypeConstructor&&…
条件无效,如果由于步骤4,
targetTypeConstructor
实际上为
null
,则在运行时必须使用此选项,以防止targetTypeConstructor的
对象实例抛出
TypeError
在:

12.10.4运行时语义:InstanceofOperator(V,target)

  • 如果Type(target)不是Object,则抛出一个TypeError异常
  • 让安德勒去吧?GetMethod(目标,@@hasInstance)
  • 如果instOfHandler未定义,则

    a。返回到oolean(?调用(instOfHandler,目标,«V»))

  • 如果IsCallable(target)为false,则抛出TypeError异常
  • 返回?OrdinaryHasInstance(目标,V)
  • 步骤4和5提供了与以前版本的ECMAScript的兼容性,这些ECMAScript没有使用@hasInstance方法定义instanceof运算符语义。如果对象未定义或继承@@hasInstance,它将使用默认的instanceof语义


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


    有关更多信息,您可以查看

    中的一个示例,让我们将类型缩小为更容易理解的较小的、咬合大小的片段,然后重新构建到完整的内容

    首先,让我们把
    这个新的
    从我们的脑海中抹去,把注意力集中在定义的后半部分:

    (…args:any[])=>any

    接下来,让我们暂时忘掉这些论点:

    ()=>任何

    希望这是一个返回类型
    any
    的函数

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

    (…args:any[])=>any

    …args:any[]
    正在使用Rest参数构造,该构造实质上表示可以有任意数量的所提供类型的参数
    any
    。由于存在未知数量的
    any
    参数,因此参数的类型是
    any
    数组

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

    最后,我们可以添加回
    new
    关键字以获得:

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

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

    这使我们了解到函数是一个函数,它接受任何数量的参数(类型为
    any
    ),返回类型为
    any
    ,并且可以用作带有
    new
    关键字的构造函数


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

    将其分解为若干部分:

    新增

    TypeScript中的这个关键字指定给定属性的构造函数应该是什么样子。这里的解释很好:

    (…args:any[])=>any

    此语法描述函数类型(构造函数是函数)

    ..

    是ES6排列运算符。它是一个接一个列出所有数组元素的缩写

    任何[]

    意味着
    args
    是一个数组,其元素可以是任何类型

    =>任何


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

    OK因此有效地说是new(…args:…)是typescripts表示函数是构造函数类型的方式吗?具体地说是,
    new(…)=>…
    表示构造函数。因此,如果我正确理解targetTypeConstructor的类型===函数是多余的,因为如果always if hte targetTypeConstructor不是函数,则targetTypeConstructor的上次检查对象实例将为false。。。不知道如果java运行时出于某种原因在将来抛出异常时保留它是否更安全。。。或者在过去的某些运行时…?不,这是多余的,因为TypeScript已经在编译时强制执行该类型,所以参数将永远是除
    null
    typeof==='function'
    之外的任何内容。检查应该是targetTypeConstructor的
    targetTypeConstructor&&object instanceof targetTypeConstructor
    ,第一个条件是防止第二个条件抛出
    TypeError所必需的