タイプスクリプト:ジェネリック


ジェネリック、つまり、1つではなく、さまざまな種類の上で動作できるコンポーネントを作成することができます.これにより、ユーザーはこれらのコンポーネントを消費し、独自の型を使用できます.
使用中any 関数は、関数がargの型のすべての型を受け入れるようにするという点で一般的です.我々が数を通過するならば、我々が持つ唯一の情報はどんなタイプでも返されることができます.
私は、何が' T 'であるかについて、わかりません.
' t 'はコンパイル時にランタイムで宣言された型になります.T変数は、宣言されていない変数(私は参照を見つけることができませんでした、しかし、私は変数名に使用できるどんな有効なセットも仮定します)でありえました.同様に、タイプCが表す値が値型ではなく、より複雑なタイプ(クラス)またはインターフェースである場合、それは将来のプログラマのための有効なタイプを示すのを助けるためにTBIRALまたはTANTEARと命名されて/宣言されることができました(そして、Tがちょうど直観的でないので、最高の実行と考えられることができました).私は、大文字Tがジェネリック型を意味することを知っているので、何かを好む.ウィージングやアソメッシングも有効ですが、私はそれを好みません.( Microsofts APIはほとんど常に[ tcontext ]です.https://msdn.microsoft.com/en-us/library/gg679506(v=vs.113).aspx または[ tentity ]https://msdn.microsoft.com/en-us/library/gg696460(v=vs.113).aspx 例えば).
誰かがこの機能が何であるかについて私に説明することができるならば、それも役に立つでしょう.
よく、機能は何もしていません.これは、複数のランタイム型の値を持つことができる型の関数を宣言します.それを説明する代わりに、上記のリンクから直接抜粋を加えます.

ジェネリック型変数の操作
代わりに、引数の型をキャプチャする方法が必要です.ここでは、値よりも型で動作する特殊変数の型変数を使用します.
function identity<T>(arg: T): T {
  return arg;
}
引数argの長さを各呼び出しでコンソールに記録したい場合はどうすればよいでしょうか?こう書くことを誘うかもしれません.
function loggingIdentity<T>(arg: T): T {
  console.log(arg.length); // Error: T doesn't have .length
  return arg;
}
コンパイラが私たちが使用しているエラーを与えます.argの長さメンバであるが、argがこのメンバを持っているとはどこにもない.覚えておいてください、これらの型変数がどんなタイプのためにでも立っていると以前に言いました、したがって、この機能を使用している誰かは代わりに数で通過できました.長さメンバー.
この関数は、TよりもTの配列で直接動作するように意図しました.配列を使っているので、.長さメンバーは利用できます.他のタイプの配列を作成するように、これを記述できます
function loggingIdentity<T>(arg: T[]): T[] {
  console.log(arg.length); // Array has a .length, so no more error
  return arg;
}
console.log(loggingIdentity<string>(['cow','dog']))
一般的な関数loggingIdentityとしてのlogingingIdentityの型は、型パラメータtをとり、引数argはtsの配列であり、tsの配列を返します
私たちは、範囲の範囲で働いた一般的なアイデンティティ機能をつくりました.この節では、関数自体の型とジェネリックインターフェイスの作成方法について説明します.
//配列let list: number[] = [1, 2, 3];////let list: Array<number> = [1, 2, 3];配列内の各値に型があります.この配列に文字列を入れると、コンパイル時エラーがスローされます.また、値を取得するときにタイプセーフティとintellisense (エディタによって異なります)を取得します.
class Person {
  FirstName: string;
}

let people: Array<Person> = [];
people.push({ FirstName: "John" } as Person);
let john = people.pop();//ジョンはタイプ人です、typemcriptコンパイラはこれを知っています
//変数を人の列として宣言したからですconsole.log(john.FirstName);型の一般的な制約の宣言.オープンクローズド原理の非常に良い例https://en.wikipedia.org/wiki/Open–closed_principle .
オブジェクト指向プログラミングでは、オープン/クローズされた原則は「ソフトウェア実体(クラス、モジュール、機能など)は拡張のために開いていなければならなくて、変更のために閉じられます」と言いますすなわち、そのような実体は、そのソースコードを変更することなくその振る舞いを拡張することができます.
次の例では、誰もが人間やチータを拡張したり、独自の派生型を作成したり、ロガー機能を変更せずに動作します.
interface IAnimal {
  LegCount: number;
}

class Cheetah 
  implements IAnimal {
  LegCount: number = 4;
}

class Human
  implements IAnimal {
  LegCount: number = 2;
}

public class Logger<TAnimal extends IAnimal> {
  public Log(animal: TAnimal) {
    console.log(animal.LegCount);
  }
}

var logger = new Logger();
var human = new Human();
logger.Log(human);
前の例では[ generic制約]を使いました.https://www.typescriptlang.org/docs/handbook/generics.html#generic-constraints Tinimal型プログラマを制限するには、インターフェイスiAnimalから派生する型へのLoggerインスタンスを作成できます.これにより、コンパイラは、ロガークラスが常に型をプロパティLegCountと仮定していることを検証できます.
あなたはなぜ私が説明することができますタイプのドキュメントではなく、代わりに何かを示すような記述を置く.何も私のために同じです.今、誰もが同じような馬鹿を使用するか、何かを欠場か?
これらはすべて以下の仮定になります.私は、タイプスクリプトジェネリックシステムを設計したチームもドキュメンテーションを書いたチームも知りません.
ジェネリックのルートレベルでは、任意の型としてTを使用することができます.意味の配列はインターフェイスです(より良い単語がないため).
アレイ
インタフェースの配列については、Tよりも意味があるのでしょうか?私は知りません.私はTがタイプ(数字、ストリングなど)でなければならないことを知っています.私は、タイプまたはタイプが予約されたか制限されるならば、アレイが本当に混乱している/そして、あるいは、また、無効であるかもしれないと思います(現在のタイプは特定の文脈で特別な意味を持っていますので、それも貧弱な選択でもあります).その他の言語https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/generic-methods , [ Java ] :https://docs.oracle.com/javase/tutorial/java/generics/types.html ) また、Tの使用を選択するので、言語間の切り替えと同じ用語を使用することが有利です.
フリップ側では、次の意味は何ですか?
アレイ
ここのアイデンティティは何ですか?他の開発者や将来の開発者がそれが何であるかを知るための制約はありません.私が明示的に実装しなければならない特定のタイプされた配列であるように私に表示されます.
interface Foo1 {
  bars: Array<Identity>;
}
前の例では、Iと(おそらくほとんどの開発者)は、アイデンティティが既存の型であると仮定します.
interface Foo2<T> {
  bars: Array<T>;
}
Foo 2で、私はタイプを選ばなければならないということを知っています.
interface Foo3<Identity> {
  bars: Array<Identity>;
}
Foo 3はちょうど混乱です.
interface Foo4<TIdentity> {
  bars: Array<TIdentity>;
}
今、FAT 4では、私は、私はタイプを選択する必要があります私は自信を持っていますが、私はまだビットの理由titity混乱しています.明らかに、タイプがより定義されるいくつかの文脈では、それは意味をなすでしょう.