![](/img/trans.png)
[英]Typescript: Why is it that we cannot assign default value to 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.