我正在阅读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
的任何想法?这是我第一次看到这种类型的构造......
答案 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 ,目标)
- 如果Type( target )不是Object,则抛出 TypeError 异常。
- 让 instOfHandler 成为? GetMethod( target ,@@ hasInstance)。
如果 instOfHandler 不是未定义,那么
一个。返回ToBoolean(?调用( instOfHandler ,目标,« V »))。
- 如果IsCallable( target ) false ,则抛出 TypeError 异常。
- 回来? OrdinaryHasInstance( target , V )。
醇>请注意
步骤4和5提供了与之前版本的ECMAScript的兼容性,这些版本没有使用@@ hasInstance方法来定义 instanceof 运算符语义。如果对象没有定义或继承@@ hasInstance,则它使用默认的 instanceof 语义。
答案 2 :(得分:1)
表示参数targetTypeConstructor
是一个接受参数的函数,可以用作构造函数(您可以使用new
关键字并创建实例)。您可以传递一个简单的函数或不是摘要的类。
答案 3 :(得分:1)
将其分解成碎片:
<强> new
强>
TypeScript中的此关键字指定给定属性的构造函数应该是什么样的。这里有很好的解释:https://stackoverflow.com/a/39623422/1678614。
<强> (...args: any[]) => any
强>
此语法描述了一个函数类型(构造函数是一个函数)。暂时忽略......部分。
<强> ...
强>
是ES6传播运营商。它是一个一个一个地列出所有数组元素的简写。
<强> any[]
强>
意味着args
是一个数组,它的元素可以是任何类型。
<强> => any
强>
指定函数的返回类型。在这种情况下,它允许构造函数返回任何类型。