2016-11-26 64 views
3

我不明白泛型在typecirpt中的實際用途是什麼。在打字稿中實際使用泛型

interface ICustomer 
{ 
    name: string; 
    age: number; 
} 


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


resNumber = CalcAverageCustomerAge({name: "Peter", age: 62}, 
            {name: "Jason", age: 33}); 

在我們傳遞接口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"); 
} 
} 

我們可以用generice做到這一點嗎?

如果不是什麼將是避免重複代碼的最佳實施方式。

+1

在你編輯的問題中,你不清楚你想達到什麼目的。這個架構的目標是什麼? '.c'和'.d'將無法訪問,因爲您沒有向類「base」提供任何指示這些屬性存在的信息。如果你想讓那些屬性可訪問,那麼這就是錯誤的設計,我們需要更多的信息來說明你真正想做什麼才能給你一個體面的答案,以便如何實現它。 – Nypan

回答

1

在你的例子中,你所需要的接口是正確的。

泛型是有用的,當你想做點什麼泛型;有時它可能非常通用,甚至不需要接口。你提出的例子不僅是通用的,它還限制了通用接口的外觀。

通用可用的其他示例是可以包含任何類型的項目的集合。打字稿中的數組類型就是一個例子 - 例如,var a = new Array<number>()

但是說你要創建一個比較兩個項目,像這樣的功能:

interface IValue { value: number; } 

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

在這種情況下,你有問題,該max函數返回其作爲IValue在大多數情況下,結果這不是你想要的。你需要的是這樣的:

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

我編輯了這個問題,請看看。 請刪除該對等Rieview。 這是一個錯誤。 – user7131571