我不明白泛型在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做到這一點嗎?
如果不是什麼將是避免重複代碼的最佳實施方式。
在你編輯的問題中,你不清楚你想達到什麼目的。這個架構的目標是什麼? '.c'和'.d'將無法訪問,因爲您沒有向類「base」提供任何指示這些屬性存在的信息。如果你想讓那些屬性可訪問,那麼這就是錯誤的設計,我們需要更多的信息來說明你真正想做什麼才能給你一個體面的答案,以便如何實現它。 – Nypan