2016-11-26 43 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