如何了解下面這段代碼裡的 new 操作?
/**
* 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;
}
我們逐漸分解。
() => any
該函數沒有輸入參數,傳回任意類型。
(…args: any[]) => any
…args: any[]使用的是Rest Parameters構造,該構造本質上表示可以提供any類型的任何數量的參數。因為存在數量未知的any參數,是以參數的類型是any的數組。
最後,把 new 關鍵字補上。
new (…args: any[]) => any
此處的new關鍵字指定可以将此函數視為類構造函數,并使用new關鍵字進行調用。
回到文章開頭的函數:
該函數是一個可以接受傳回類型any的任意數量的參數(類型為any的函數),并且可以用作帶有new關鍵字的構造函數。
看一個該函數具體消費的例子:
function isInstance(object: any, targetTypeConstructor: new (...args: any[]) => any) {
class Jerry{
constructor(private name:string){
this.name = name;
}
const jerry: Jerry = new Jerry('Jerry');
console.log(isInstance(jerry, Jerry));
輸出:true
Argument of type ‘typeof Jerry’ is not assignable to parameter of type ‘(…args: any[]) => any’.
Type ‘typeof Jerry’ provides no match for the signature ‘(…args: any[]): any’.