Я не понимаю, что такое фактическое использование дженериков в typescirpt.Реальное использование generic в машинописных текстах
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");
}
}
Можем ли мы добиться этого с помощью генераторов?
Если нет, то какой был бы лучший способ реализации, избегая дублирования кодов.
В вашем отредактированном вопросе неясно, чего вы хотите достичь. Какова цель этой архитектуры? '.c' и' .d' будут недоступны, поскольку вы не даете классу 'base' любую информацию, указывающую, что эти свойства существуют. Если вы хотите, чтобы эти свойства были доступны, это неправильный дизайн, и нам нужна дополнительная информация о том, что вы на самом деле хотите сделать, чтобы дать вам достойный ответ о том, как его достичь. – Nypan