簡體   English   中英

從打字稿中的通用類型調用通用類型的靜態函數

[英]Call static function of Generic Type from Generic Type in typescript

我在服務類中有一個函數,該函數傳遞了擴展我的Bean類的通用類型。 我希望函數在Bean類中調用靜態函數來創建Bean數組。 我在操場上的代碼可以編譯,但是出現運行時瀏覽器錯誤

Uncaught TypeError: ctor.constructor.fromEntryList is not a function

如果刪除.constructor得到創建的bean數組,但是如果沒有.constructor ,則會出現打字稿錯誤。

我不知道如何正確鍵入此功能的腳本代碼。 非常感謝任何幫助,因為我未能找到關於SO的先前答案。

碼:

// Base class that will be extended
class Bean {
    id: number;

    static fromEntryList<T1>(ctor: new (p: number) => T1, numbers: Array<number>): Array<T1> {

        let result: Array<T1> = [];
        for (let anumber of numbers) {
            result.push(new ctor(anumber));
        }
        return result;
    }


    constructor(p: number) {
        this.id = p;
    }
}

// Base service class that will be extended
class BeanService {


    constructor() { }

    get_entry_list<T extends Bean>(ctor: new (p: number) => T): T[] {
        let x: T[] = (<typeof Bean>ctor.constructor).fromEntryList(ctor, [1, 2, 3, 4]);
        return x;
    }
}

let service = new BeanService();
let beans: Bean[] = service.get_entry_list(Bean);

操場上的代碼

謝謝。

get_entry_list的param定義中,它僅定義ctor的類型,但缺少靜態方法接口,因此,在運行時可以正確訪問這些屬性的同時,對其進行訪問會引發編譯錯誤。

您可能可以定義構造函數接口,

interface XXX<T> {
  new(p: number): T;
  fromEntryList<U>(ctor: new (p: number) => U, numbers: Array<number>): Array<U>;
}

這基本上是Bean表示形式,然后將其用於param的簽名

get_entry_list<T extends Bean>(ctor: XXX<T>): Array<T>

允許get_entry_list中提供的ctor可以訪問靜態方法。

操場:

https://www.typescriptlang.org/play/#src=%2F%2F%20Base%20class%20that%20will%20be%20extended%0D%0Aclass%20Bean%20%7B%0D%0A%20%20id% 3A%20number%3B%0D%0A%0D%0A%20%20static%20fromEntryList%3CT1%3E(ctor%3A%20new%20(p%3A%20number)%20%3D%3E%20T1%2C%20numbers %3A%20Array%3Cnumber%3E)%3A%20Array%3CT1%3E%20%7B%0D%0A%0D%0A%20%20%20%20%20%20let20let%20result%3A%20Array%3CT1% 3E%20%3D%20%5B%5D%3B%0D%0A%20%20%20%20%20%20for%20(let%20anumber%20of%20numbers)%20%7B%0D%0A%20 %20%20%20%20%20%20%20%20%20result.push(new%20ctor(anumber))%3B%0D%0A%20%20%20%20%20%20%20%7D%0D %0A%20%20%20%20%20%20return%20result%3B%0D%0A%20%20%7D%0D%0A%0D%0A%0D%0A%20%20constructor(p%3A%20number )%20%7B%0D%0A%20%20%20%20%20%20this.id%20%3D%20p%3B%0D%0A%20%20%7D%0D%0A%7D%0D% 0A%0D%0Ainterface%20XXX%3CT%3E%20%7B%0D%0A%20%20new(p%3A%20number)%3A%20T%3B%0D%0A%20%20fromEntryList%3CU%3E(ctor %3A%20new%20(p%3A%20number)%20%3D%3E%20U%2C%20numbers%3A%20Array%3Cnumber%3E)%3A%20Array%3CU%3E%3B%0D%0A%7D %0D%0A%0D%0A%2F%2F%20Base%20service%20class%20that% 20will%20be%20extended%0D%0Aclass%20BeanService%20%7B%0D%0A%0D%0A%0D%0A%20%20constructor()%20%7B%20%7D%0D%0A%0D%0A% 20%20get_entry_list%3CT%20擴展%20Bean%3E(ctor%3A%20XXX%3CT%3E)%3A%20Array%3CT%3E%20%7B%0D%0A%20%20%20%20%20%20%20let %20x%3A%20T%5B%5D%20%3D%20ctor.fromEntryList(ctor%2C%20%5B1%2C%202%2C%203%2C%204%5D)%3B%0D%0A%20% 20%20%20%20%20return%20x%3B%0D%0A%20%20%7D%0D%0A%7D%0D%0A%0D%0Alet%20service%20%3D%20new%20BeanService()% 3B%0D%0Alet%20beans%3A%20Bean%5B%5D%20%3D%20service.get_entry_list(Bean)%3B%0D%0A%0D%0Aconsole.log(beans)%3B

暫無
暫無

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

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