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所必需的