2016-11-26 5 views
3

typescirpt에서 제네릭을 실제로 사용하는 이유는 무엇입니까?실제 타이프 스크립트에서 일반 사용

위의 예에서 인터페이스 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

예를 들어 인터페이스가 모두 필요한 것이 맞습니다.

Generics는 무언가를 만들고 싶을 때 유용합니다. ; 때로는 인터페이스가 필요하지 않은 매우 일반적인 것일 수도 있습니다. 가져 오는 예제는 generic 일뿐만 아니라 인터페이스를 통해 generic이 어떻게 보이는지 제한합니다.

제네릭을 사용할 수있는 다른 예는 모든 유형의 항목을 포함 할 수있는 모음입니다. typescript의 배열 유형은 예를 들어 var a = new Array<number>()입니다.

그러나

당신이 두 항목이 같은 비교하는 기능을 만들려는 말 다음 max 기능은 대부분의 경우에 IValue 등의 결과를 반환 당신은 문제가이 경우

interface IValue { value: number; } 

function max(a: IValue, b: IValue): IValue { 
    return a.value > b.value ? a : b; 
} 

를이 네가 원하는게 아니야. 여기

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

관련 문제