我正在阅读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
的任何想法?这是我第一次看到这种结构...
让我们将类型减小为更容易理解的较小,咬合的小块,然后重新构建完整的块。
首先,让我们将new
从我们的思维中移开,并专注于定义的后一部分:
(...args: any[]) => any
接下来让我们暂时忘记参数:
() => any
希望这是一个返回类型any
的函数。
接下来我们可以在参数中添加回来:
(...args: any[]) => any
...args: any[]
正在使用“剩余参数”构造,该构造实质上表示可以提供给定类型any
的任意数量的参数。由于any
参数的数量未知,因此参数的类型为any
的数组。
所以现在希望这是一个可以接受任意数量的参数(any
类型,并返回any
类型的函数。
最后,我们可以添加回new
关键字以获得:
new (...args: any[]) => any
此处的new
关键字指定可以将此函数视为类构造函数,并使用new
关键字进行调用。
这为我们提供了一个完整的图片,该函数是一个接受任意数量(返回any
类型的参数)并返回类型any
并可以与new
关键字一起用作构造函数的函数] >。
在API上下文中使用时,实际上是允许您将任何类构造函数传递给该函数。
分解成碎片:
意味着参数targetTypeConstructor
是一个接受参数的函数,并且可以用作构造函数(可以与new
关键字一起使用并创建实例)] >>。您可以传递不是abstracts >>。
new (...args: any[]) => any
此类型指定一个函数,该函数接受
any
类型的任意数量的参数,返回any
值,并且可以用new
调用。