簡體   English   中英

Typescript中Generic類中Type的默認值

[英]Default value of Type in Generic classes in Typescript

我需要根據下面的Typescript泛型類中的類型設置變量的默認值

  class MyClass<T>{
      myvariable: T // Here I want to set the value of this variable 
                    // with the default value of the type passed in 'T'
    }

例如,如果T是數字,則變量myvariable的默認值應為“0”,類似於字符串,它應為空字符串,依此類推。

你不能這樣做,因為T的實際類型只能在運行時知道。

你可以做什么:

abstract class MyClass<T> {
    myvariable: T;

    constructor() {
        this.myvariable = this.getInitialValue();
    }

    protected abstract getInitialValue(): T;
}

現在你只需擴展這個類,如下所示:

class MyStringClass extends MyClass<string> {
    protected getInitialValue(): string {
        return "init-value";
    }
}

編輯

你要求的是無法完成的,因為T只存在於typescript領域,並且它不會在編譯過程中“存活”。

例如,這個:

class MyClass<T> {
    myvariable: T;

    constructor(value: T) {
        this.myvariable = value;
    }
}

編譯成:

var MyClass = (function () {
    function MyClass(value) {
        this.myvariable = value;
    }
    return MyClass;
}());

如您所見,在編譯版本中沒有T ,因此您無法在運行時使用該信息來生成默認值。


另一個解決方案是擁有默認值的映射:

var defaultValues = {
    "string": "",
    "number": 0,
    "boolean": false
}

class MyClass<T> {
    myvariable: T;

    constructor(value: T) {
        this.myvariable = value;
    }
}

let a = new MyClass<string>(defaultValues.string);
let b = new MyClass<boolean>(defaultValues.boolean);

您還可以使用靜態工廠方法:

class MyClass<T> {
    myvariable: T;

    constructor(value: T) {
        this.myvariable = value;
    }

    static stringInstance(): MyClass<string> {
        return new MyClass<string>("");
    }

    static numberInstance(): MyClass<number> {
        return new MyClass<number>(0);
    }

    static booleanInstance(): MyClass<boolean> {
        return new MyClass<boolean>(false);
    }
}

let a = MyClass.stringInstance();
let b = MyClass.booleanInstance();

T在運行時丟失,因此您需要傳遞類似值的類型。 你可以通過傳遞構造函數來做到這一點。

當我有類似需求時,我通常使用這樣的界面:

interface Type<T> {
     new() : T;
}

並像這樣創建MyClass:

class MyClass<T>{
    myvariable: T;

    constructor(type: Type<T>) {

        this.myvariable = new type();
    }
}

然后我可以這樣使用MyClass:

let myinstance = new MyClass(TheOtherType);

它適用於類,但不適用於字符串和數字等內置函數。

TheOtherType是類的構造函數,例如:

class TheOtherType {
}

嗯,我想我想出了一個可能的解決方案。 無論如何,我必須說Nitzan Tomer是正確的,並且類型在運行時不可用。 這是TS的搞笑一面:)

在這里,您可以檢查所獲對象的類型,然后設置默認值。 您也可以更改地點和要檢查的對象,以便按照您想要的方式進行檢查,但我想這對您來說可能是一個很好的起點。 請注意,您必須進行雙重轉換,因為TS無法保證類型兼容。 我還沒有嘗試過,但編譯得很好

class MyClass<T>{
      myvariable: T 

    constructor(param: any) {
        if (typeof param === 'string') {
            this.myvariable = <T><any> "";
        }
        else if (typeof param === 'number') {
            this.myvariable = <T><any> 0;
        }
    }  
}

暫無
暫無

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

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