gpt4 book ai didi

oop - 泛型在 typescript 中的实际使用

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:45 25 4
gpt4 key购买 nike

我不明白 typescirpt 中泛型的实际用途是什么。

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});

在上面的示例中,我们将接口(interface) c 传递给函数 CalcAverageAge。

但是如果不使用 extends ICustomer,我们就不能在该类中使用年龄和姓名。

那么在函数中传入template(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");
}
}

我们能否通过泛型实现这一目标?

如果不是,避免重复代码的最佳实现方式是什么。

最佳答案

在您的示例中,接口(interface)是您所需要的是正确的。

泛型在您想要制作泛型时很有用;有时它可能非常通用,您甚至不需要接口(interface)。您提出的示例不仅是通用的,而且还限制了通用接口(interface)的外观。

泛型可用于的其他示例是可以包含任何类型项目的集合。 typescript 中的数组类型就是一个例子 - 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是的,这个更有用。

关于oop - 泛型在 typescript 中的实际使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40823278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com