Typescript中Generic类中Type的默认值

Ris*_*ari 6 javascript generics default-value 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'
    }
Run Code Online (Sandbox Code Playgroud)

例如,如果T是数字,那么变量的默认值myvariable应为"0",类似于字符串,它应该是空字符串,依此类推.

Nit*_*mer 9

您不能这样做,因为实际类型T只能在运行时知道.

你可以做什么:

abstract class MyClass<T> {
    myvariable: T;

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

    protected abstract getInitialValue(): T;
}
Run Code Online (Sandbox Code Playgroud)

现在你只需扩展这个类,如下所示:

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

编辑

您要求的是无法完成的,因为T只存在于打字稿领域,并且它不会在编译过程中"存活".

例如,这个:

class MyClass<T> {
    myvariable: T;

    constructor(value: T) {
        this.myvariable = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译成:

var MyClass = (function () {
    function MyClass(value) {
        this.myvariable = value;
    }
    return MyClass;
}());
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,在编译版本中没有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);
Run Code Online (Sandbox Code Playgroud)

您还可以使用静态工厂方法:

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();
Run Code Online (Sandbox Code Playgroud)