如何理解类型`new(... args:any [])=> any`

Ole*_*Ole 2 javascript validation instanceof typescript

我正在阅读类验证器库的代码,它具有以下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;
}
Run Code Online (Sandbox Code Playgroud)

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

Nel*_*elu 8

将其分解为几部分:

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

(...args: any[]) => any
该语法描述了一个函数类型(构造函数是一个函数)。

...
是 ES6 扩展运算符。它是一一列出所有数组元素的简写。

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

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


cas*_*ber 5

让我们将类型减少为更容易理解的更小,更小尺寸的块,然后重新构建完整的块。

首先,让new我们抛开脑海,专注于定义的后半部分:

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

接下来,让我们暂时忘记参数:

() => any

希望这是一个返回type的函数any。

接下来,我们可以重新添加参数:

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

...args: any[]使用的Rest Parameters构造本质上说可以提供任意类型的参数any。由于any参数数量未知,因此参数的类型为的数组any。

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

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

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

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

这给我们提供了整个画面,该函数是一个接受任何类型的参数(any返回类型)的函数,any可以将其用作带有new关键字的构造函数。

当在API上下文中使用时,它实际上允许您将任何类构造函数传递给该函数。