簡體   English   中英

如何在TypeScript中為特定類型的泛型類型創建擴展方法

[英]How to create an extension method for a specific type of generic type in TypeScript

對於我正在從事的半教育性副項目,我有一個TypeScript interface ,該interface在實現它的任何對象上公開一個id變量。 在這個應用程序中,這些IIdable對象的Array<>很合理。

由於此應用程序不使用數據庫,因此我正在嘗試執行的操作是對服務執行自動遞增,以跟蹤這些IIdable列表。 自然,我考慮過以如下“ JavaScript”方式添加擴展...

Array<MyProject.Models.IIdable>.prototype.getNextId = () => {
    let biggestId: number = 0;
    for (let current of this) {
        if (current.id > biggestId)
            biggestId = current.id;
    }

    return biggestId + 1;
};

...但是Visual Studio Code會引發幾個錯誤,其中一個是:

Cannot find name 'prototype'

考慮到Array<T>是JavaScript的“原始”對象,並且考慮到一切都是JavaScript中的object ,因此,我發現這是有問題的(因此,TypeScript的創建是為了減少或避免某些問題。)但是,我意識到我我知道足夠多的JavaScript和TypeScript是“危險的”,這意味着我知道足夠多的知識來允許自己做一些愚蠢的事情。

如果我使用的是C#-而不是TypeScript-我會編寫這樣的擴展方法,如下所示:

public static GetNextId(this List<IIdable> source)
{
    // ...Read each IIdable's ID to figure out the next biggest to give.
}

...不幸的是,據我所知我做不到。 在發布此問題之前,我對使用TypeScript編寫擴展方法進行了一些研究。 一個這樣的答案是用新方法修改主機類型的接口,在這種情況下,我不想這樣做。 我只想為處理Array<IIdable>而不是其他情況的情況添加擴展名。

因此,我必須問: 在TypeScript中,對於某種特定類型的東西,我可以用哪種方式在通用類型上編寫擴展方法?

通用類Array只有一個原型。 訪問原型時,您不能指定類型參數。 但是,您可以在方法上覆蓋this類型。 這是您聲明然后定義方法的方法。 注意,必須使用一個function函數,這是能夠接收的this參數,而不是箭頭功能,始終使用this那是在范圍在那里它被定義(在這種情況下是全局對象)。

interface Array<T> { 
  getNextId(this: MyProject.Models.IIdable[]): number;
}

// The `this` type for the function is taken from the declaration above.
Array.prototype.getNextId = function() {
    let biggestId: number = 0;
    for (let current of this) {
        if (current.id > biggestId)
            biggestId = current.id;
    }

    return biggestId + 1;
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM