活字体の高度なタイプ

クロスタイプ

型に、および集合の二つのタイプに合わせた複数種類の。継承、継承の違いは、独自の属性を持つことができますが、交差はありません。

{DogInterfaceインタフェース
   RUN():ボイド
} 
インターフェイスCatInterface { 
   ジャンプ():ボイド
} 
せPET:DogInterface&CatInterface = {//は一つの例外を除いて、多重継承とインターフェイスのように見えます。継承は交差しない、自分の属性を持つことができます。
   RUN(){}、
   ジャンプ(){} 
}。

ユニオンタイプ

型宣言は、それが複数のタイプであってもよいし、不確実です。

てみましょう:数|文字列= " "; // タイプ定義され
たlet B: "" | " B" | "C"; // 値が定義され
てみましょうC:1 | 2 | 3 | "V"; // 限られた値

保護タイプを区別することができます。

2つの//形状があり、面積関数は、各形状の面積を計算するために使用されます。
インタフェーススクエア{ 
   種類:「正方形」; 
   サイズ:数; 
} 
矩形をインターフェース{ 
   種類:「長方形」、
   幅:数、
   高さ:数、
} 
形状=角型|矩形を、
機能エリア(S:形状){ 
   (Sを切り替えます.kind){ 
      :ケース"スクエア" 
         ; //このブロック内で、確実にすることが唯一のサイズ属性* s.size戻りs.size 
      :ケース"長方形" 
         ;戻りs.height * s.width 
   } 
} 
はconsole.log(エリア({種類: "正方形"、サイズ:10})); // 100 
//今形状を追加:円形。インタフェースサークルを定義するために、関節型円形、面積関数を増加させる場合に加えました。私たちは地域の機能を変更するのを忘れた場合でも、何が起こりますか?
インターフェースサークル{
   種類:「円」、
   R:ナンバー、
} 
| Rectangleの|タイプの形状=スクエアサークル; 
はconsole.log(エリア({種類: "サークル"、R:10})); //未定義、エラーはここではない、我々の期待を満たしていません。我々は時間にそれはバグを露出させることができることを願って、プログラムの安定性を高めます。
:次のように変更してください
機能エリア(S:形状){ 
   スイッチ(s.kind){ 
      :ケース"スクエア" 
         ;戻りs.size * s.size 
      ケース"長方形":
         リターンs.height * s.width; 
      ケース「サークル「:
         にMath.PIのSR *を返します。
      デフォルト:
         リターン((E:任意の)=> {スロー新しい新しいエラー( `$ {S}が定義されていない領域の計算`)})(複数可)//このステップは、重要ですここに例外をスローするようにしてください
   } 
}

インデックスタイプ

私たちは存在しないインデックスを使用する場合、それは何の制約(以下コード)がない、未定義が返されます。だから我々は、インデックス上の制約を持っている必要があります。

{OBJ =せ
   :. 1、
   B:2、
   C :. 3、
}; 
のgetValue(OBJ:任意、キー:文字列[]){機能
   、リターンkeys.map(キー=> OBJ [キー])
} 
はconsole.logを(のgetValue(OBJ、[ "A"、 "B"])); 
はconsole.log(のgetValue(OBJ、[ "C"、 "F"])); //見つけ、出力に対応する'F'は未定義です何の制約は、インデックス・タイプを使用する必要がありません

次のインデックスタイプを使用します。

関数のgetValue <T、Kが延びkeyof T>(OBJ:T、キー:Kは、[]):T [K] [] {// T [K] []を表す戻り値はOBJからなる値のリストでなければなりません
   keys.map返す(キー=> OBJ [キー]); // この場合、キーOBJにのみキーの要素
} 
はconsole.log(のgetValue(OBJ、[ "A"、 "B"]))。
console.log(のgetValue(OBJ、[ " C"、 "F"])); // この場合は与えられる、制約と'F'は"されていない " | "B" | "C"

さんに説明してみましょう:

ここでは、2つの演算子の使用、およびクエリ演算子アクセスオペレータkeyof T T [K](以下の例を参照)。<T、Kが延びkeyof T>は、汎用制約を使用し、パラメータの値は、Kは、結合したTのみのパラメータデータを拘束されている「キー」。

// keyof T 
インターフェースのObj { 
   :数。
   B:文字列。
} 
キーを聞かせて:keyof OBJに。//此时キーの表示'' | 'B' 
 
// T [K] 
のObj [ 'A'] //番号:値を聞かせ

マッピングのタイプ

あなたは、古いタイプから新しいタイプを生成することができます。たとえば、インターフェイスのすべてのメンバーは、オプションの読み取り専用となります。

TSは、マッピングタイプの多くを構築しました。

{OBJのインタフェース
   A:文字列; 
   B:数; 
   C:ブール; 
} 
//のObjインターフェース部材それぞれ読み取り専用プロパティには、新しいインターフェースを生成します。
入力ReadonlyObj =読み取り専用<OBJの>; //読み取り専用TSは、マッピング・タイプ、以下同じ構築される
//読み取り専用実現原理、動作のインデックス型方法の使用
タイプ読み取り専用<T> = { 
   読み取り専用[keyofにおけるT P] T [ P]; 
}

別の例:

//オプションの属性が全てになり
、タイプPartialObjパーシャル= <OBJの> 
部分の//実装原理
型部分<T> = { 
   ?[keyofにおけるP T] T [P]; 
} 

//元のサブタイプを取得しますセット
ピックPickObj = <Objに、 '|「B」>のタイプ; 
//等価
インタフェースPickObj { 
   :文字列、
   B:数
} 

//タイプの新しいタイプの元メンバーとして
タイプRecordObj =録音<「X」 | 'Y'、objが>; 
//等価
インタフェースRecordObj { 
   X:のObj、
   Y:のObj、
}

ソファ

条件タイプ

条件タイプは、意思決定の式の型を指します。条件タイプの種類は、言語の柔軟性を高め、独自性を持っていません。

例えば:

TはU X :? Yは、タイプTがU型に割り当てることができる場合、名前はX型、Y型又は他与える結果に与えると言って延び

別の例:

型名タイプ<T> = 
   T延びている文字列:? 
   T延び番号番号:?
   T延びブールブール:? 
   T延び不定不定:? 
   T延びている機能機能:?
   オブジェクト; 

タイプ= Tlの型名の<string>、Tlのに//文字列型の
型T2 =型名<文字列[] >; // T2のタイプオブジェクト
タイプT3 =型名<機能>; // T3は、 関数型である
タイプT4 =型名<文字列|列 []>; // T4 文字列にオブジェクトのジョイントタイプ

 何をするために使用することができますか?

(A | B)はUを拡張しますか?X:Y 
解析为(AはU X拡張:?Y)を| (Bは、Uを拡張X:Y)を

これは、例えば、フィルタの種類を作るために使用することができます。

T ;?:差分タイプ<T、U-> TはU-決して延び= 

; //最初の役割は除外することにあるタイプ= T5差分<| 'B' | | 'C'、 '' 'E' 'A'を>パラメータ「」。'C'関節型| T5は'B'であり、
解決プロセス:
 差分< 'A'、 'A' | 'E'> |差分< 'B'、 'A' | 'E'> |差分< 'C'、 'A' | 'E'> 
 決して| 'B' | 'C' 
 B '' | 'C'

内蔵の条件タイプTS:

除外<Tを、U> //割り当ては、Uを入力するTから除外することができ、上記の例差分に相当
<T、U> // Tは、抽出されたタイプUに割り当てることができるエキス 
NonNullable <T> // T nullとundefinedから除外。
がReturnType <T> //関数の戻り値の型を取得します。
InstanceType <T> //型コンストラクタ型のインスタンスを取得します。

 

おすすめ

転載: www.cnblogs.com/V587Chinese/p/11478492.html