亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從泛型類中的類型參數創建新對象

從泛型類中的類型參數創建新對象

慕哥9229398 2019-11-12 09:42:08
我正在嘗試在我的通用類中創建一個類型參數的新對象。在我的課程中View,我有2個作為類型參數傳遞的泛型類型對象列表,但是當我嘗試制作時new TGridView(),TypeScript說:找不到符號'TGridView這是代碼:module AppFW {    // Represents a view    export class View<TFormView extends FormView, TGridView extends GridView> {        // The list of forms         public Forms: { [idForm: string]: TFormView; } = {};        // The list of grids        public Grids: { [idForm: string]: TGridView; } = {};        public AddForm(formElement: HTMLFormElement, dataModel: any, submitFunction?: (e: SubmitFormViewEvent) => boolean): FormView {            var newForm: TFormView = new TFormView(formElement, dataModel, submitFunction);            this.Forms[formElement.id] = newForm;            return newForm;        }        public AddGrid(element: HTMLDivElement, gridOptions: any): GridView {            var newGrid: TGridView = new TGridView(element, gridOptions);            this.Grids[element.id] = newGrid;            return newGrid;        }    }}我可以從通用類型創建對象嗎?
查看完整描述

3 回答

?
蕪湖不蕪

TA貢獻1796條經驗 獲得超7個贊

因為已編譯的JavaScript刪除了所有類型信息,所以您不能使用它T來創建對象。


您可以通過將類型傳遞給構造函數來以非泛型方式進行操作。


class TestOne {

    hi() {

        alert('Hi');

    }

}


class TestTwo {

    constructor(private testType) {


    }

    getNew() {

        return new this.testType();

    }

}


var test = new TestTwo(TestOne);


var example = test.getNew();

example.hi();

您可以使用泛型來擴展此示例以加強類型:


class TestBase {

    hi() {

        alert('Hi from base');

    }

}


class TestSub extends TestBase {

    hi() {

        alert('Hi from sub');

    }

}


class TestTwo<T extends TestBase> {

    constructor(private testType: new () => T) {

    }


    getNew() : T {

        return new this.testType();

    }

}


//var test = new TestTwo<TestBase>(TestBase);

var test = new TestTwo<TestSub>(TestSub);


var example = test.getNew();

example.hi();


查看完整回答
反對 回復 2019-11-12
?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

要在通用代碼中創建新對象,您需要通過其構造函數來引用類型。所以不用寫這個:


function activatorNotWorking<T extends IActivatable>(type: T): T {

    return new T(); // compile error could not find symbol T

}

您需要編寫以下代碼:


function activator<T extends IActivatable>(type: { new(): T ;} ): T {

    return new type();

}


var classA: ClassA = activator(ClassA);


查看完整回答
反對 回復 2019-11-12
?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

所有類型信息都在JavaScript端被擦除,因此您不能像@Sohnee狀態那樣更新T,但是我更喜歡將類型化參數傳遞給構造函數:


class A {

}


class B<T> {

    Prop: T;

    constructor(TCreator: { new (): T; }) {

        this.Prop = new TCreator();

    }

}


var test = new B<A>(A);


查看完整回答
反對 回復 2019-11-12
  • 3 回答
  • 0 關注
  • 1041 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號