クロスタイプ
型に、および集合の二つのタイプに合わせた複数種類の。継承、継承の違いは、独自の属性を持つことができますが、交差はありません。
{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> //型コンストラクタ型のインスタンスを取得します。