簡體   English   中英

在不指定類型的情況下實例化TypeScript通用類

[英]Instantiating TypeScript generic class without specifying type

如果我創建一個通用類

class Generic<T> {
     prop: T;
}

如果不在類型中指定T ,就不允許我輸入內容

// Generic type 'Generic<T>' requires 1 type argument(s).
const val: Generic = new Generic(); 

但是如果我使用類型推斷,它不會抱怨,它可以實例化它

const val = new Generic();
// field prop is not of type any, we can't access any properties on it
// val.prop.anything -> Compiler error
// val.prop.toString() -> No error, is it a string?
// val.prop.length -> Compiler error, not a string, just assumes that everything has a toString (based on boxing)

是否指定了此行為? 這背后的原因是什么?

背景

Angular2有一個EventEmitter ,它需要事件的參數類型。 但是,對於某些事件,您不傳遞任何參數,在這種情況下,我們一直在使用EventEmitter<void> 但是,我剛剛注意到,您可以僅定義發射器而無需指定類型, new EventEmitter()可以工作。 這種方法的缺點是,如果您將參數傳遞給emitter.emit('something') ,編譯器將不會抱怨。 這不是我感興趣的,只是背景,因此讀者可以了解問題的出處。

游樂場 https://www.typescriptlang.org/play/#src=class%20Generic%3CT%3E%20%7B%0D%0A%20%20%20%20prop%3A%20T%3B%0D%0A% 7D%0D%0A%0D%0Aconst%20val%3A%20Generic%20%3D%20new%20Generic()%3B%0D%0A%0D%0Aconst%20val2%20%3D%20new%20Generic()%3B% 0D 0A%%0D%0Aval2.prop.test%20%3D%201%3B

以下兩個語句是等效的...

const val: Generic<{}> = new Generic();
const val2 = new Generic();

在第一種情況下,從左側的類型推斷出在右側省略的type參數。

在第二種情況下,您最終得到的是對象類型,因為無法推斷出更具體的信息。

此處的規則是變量的類型必須滿足通用類型參數。 當您使用const val: Generic = new Generic(); type參數不滿足-您無法要求對其進行推斷,因為您已決定對變量進行注釋。

因此,兩個允許的方案是:

  1. 用類型注釋自己指定(整個)類型
  2. 允許(整個)類型由編譯器推斷

為了使后面的示例生效,您有兩個選擇。

選項1 ...如果您真的不想限制類型,請動態選擇...

const val2 = new Generic<any>();
val2.prop.test = 1;

或者......選項2 ...如果想限制類型,指定它。

const val2 = new Generic<{ test: number }>();
val2.prop.test = 1;

最后,在許多情況下,您無需指定type參數,因為可以根據上下文進行推斷。

暫無
暫無

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

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