2016-11-26 7 views
3

typescirptのジェネリックの実際の使用法はわかりません。実際のタイプコピーのジェネリックの使用

上記の例では、インターフェイスcを関数CalcAverageAgeに渡しています。

しかし、ICustomerを使用せずに、そのクラス内に年齢と名前を使用することはできません。

次に、関数内でテンプレート(c)を渡すことは何ですか? 我々は直接

function CalcAverageAge(cust1: ICustomer, cust2: ICustomer): number 
{ 
    return (cust1.age + cust2.age)/2; 
} 

あなたはジェネリックは本当に便利です実際の例を与えることができ、以下の形式でコードを書くことができますか?

ジェネリックスを使用する必要がある私のシナリオについて説明します。

interface t1{ 
a:String 
b:number 

} 
interface t2 { 
a:String 
b:number 
c:number 
} 
interface t3 { 
a:String 
b:number 
d:number 
} 

class base<T extends t1> { 
    constructor(input : T, type:string){ 

     //some common code for both derived1 and derived2 
     if(type==="derived1"){ 
     console.log(input.c);// will throw error because t1 doesn't contains c 
     } else if (type==="derived2"){ 
      console.log(input.d);// will throw error because t1 doesn't contains d 
     } 
    } 
} 

class derived1 extends<t2>{ 
constructor(){ 
var temp = {a:"11",b:2,c:3} 
super(temp,"derived1"); 
} 
class derived2 extends<t3>{ 
constructor(){ 
var temp = {a:"11",b:2,d:3} 
super(temp,"derived2"); 
} 
} 

generisでこれを達成できますか?

重複したコードを避けて実装する最良の方法は何でしょうか。

+1

編集した質問では、達成したいことは不明です。このアーキテクチャの目標は何ですか? '.c'と' .d'は、それらのプロパティが存在することを示す情報を 'base'クラスに与えていないので、アクセスできなくなります。あなたが望むものがアクセス可能なこれらのプロパティの場合、これは間違ったデザインであり、達成するための適切な答えを得るために実際に何をしたいのかについてのより多くの情報が必要です。 – Nypan

答えて

1

あなたの例では、インターフェイスが必要なだけのものであることが正しいです。

Genericsは何かを作りたいときに便利なものですgeneric;時にはそれがとても汎用的で、あなたはインターフェースを必要としないかもしれません。あなたが育てる例はジェネリックであるだけでなく、ジェネリックがインターフェイスでどのように見えるかを制限します。

ジェネリックを使用できる他の例は、任意のタイプのアイテムを含むことができるコレクションです。 typescriptの配列型は、たとえば-var a = new Array<number>()の例です。

しかし、あなたは2つのアイテムを比較する関数を作成したいと言って、このような何か:あなたはmax関数は、この多くの場合IValueとしてその結果を返すという問題がある。この場合

interface IValue { value: number; } 

function max(a: IValue, b: IValue): IValue { 
    return a.value > b.value ? a : b; 
} 

あなたが望むものではありません。ここで

interface IValue { value: number; } 

function max<T extends IValue>(a: T, b: T): T { 
    return a.value > b.value ? a : b; 
} 

maxの戻り値の型がジェネリック型Tが何であれであり、これはより有用である:何が欲しいのはこのようなものです。

+0

この例は、ジェネリックスを理解するのに十分涼しいです。 しかし、あなたは私に同意します。大きなプロジェクトで仕事をしているときは、まれに のような単純な機能(最大)を経験することはほとんどありません。 私に大規模な例を教えてもらえますか? – user7131571

+0

質問を編集しました。どうぞご覧ください。 そのピアレビューを削除してください。 間違いでした。 – user7131571

関連する問題