我不明白泛型在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