好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

TypeScript 中的泛型是协变的,因此请谨慎使用它们

如果您阅读代码,您会发现类泛型并不安全。 (为了清楚起见,我并不是说你应该避免使用泛型,只是如果你在使用泛型的类中有不同的类型参数,你应该小心。我喜欢类型难题。)
Java 泛型和 TypeScript 泛型有不同的规范。
Java 泛型是不可变的。 TypeScript 中的类泛型是协变的。在接口方面,TypeScript 似乎知道各个字段是否可分配。当我可以添加代码时,我会这样做。

  // ただのスーパークラス 
 class   SuperClass  { 
   public   name  :   string   =   "  super  " 
 } 
 // サブクラスその1 
 class   SubClass1   extends   SuperClass  { 
   public   email   =   "  bar  "  ; 
 } 
 // サブクラスその2 
 class   SubClass2   extends   SuperClass  { 
   public   address   =   "  baz  "  ; 
 } 
 // ジェネリクスを使った配列のラッパークラスのようなもの 
 // 今回の主役 
 class   List  <  T  >  { 
   public   array  :   T  []   =   []; 

   public   push  (  item  :   T  )   { 
     this  .  array  .  push  (  item  ); 
   } 

   public   get  (  index  :   number  )   { 
     return   this  .  array  [  index  ]; 
   } 
 } 

 // Listをインスタンス化 
 let   sub1List   =   new   List  <  SubClass1  >  (); 
 let   superList   =   new   List  <  SuperClass  >  (); 
 // superListにsub1Listの参照を渡す(TypeScriptのジェネリクスは共変なので可能) 
 superList   =   sub1List  ; 
 // SubClass2はSuperClassのサブクラスなので以下のコードはコンパイルエラーにならないが、、、 
 // 実際はsuperListはsub1Listを参照しているのでsub1ListにSubClass2のインスタンスが追加されている 
 superList  .  push  (  new   SubClass2  ()); 
 // itemの方はSubClass1と判定されているが実際はSubClass2である。 
 const   item  :   SubClass1   =   sub1List  .  get  (  0  ); 
 // したがって、したのコードの出力は 
 // undefined baz 
 // となる。 
 console  .  log  (  item  .  email  ,(  item   as   SuperClass   as    SubClass2  ).  address  ) 
 


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308628262.html

查看更多关于TypeScript 中的泛型是协变的,因此请谨慎使用它们的详细内容...

  阅读:46次