2017-09-07 1 views
0

나는 추상 클래스를 가지고 있는데, 그 메소드에서 제네릭 타입의 항목을 전달하고있다. 다음으로이 항목의 속성을 가져와야합니다. 올바르게 수행하는 방법은 무엇입니까?제네릭 유형의 속성을 얻는 방법?

export abstract class BaseService<T> { 
    ... 
    public saveItem(item: T) { 
     ... 
     if (item.id <=== here I got error) { 
     } 
     ... 
    } 

    export class ClusterItem { 
     id: number; 
     ... 
    } 

    export class ClustersService extends BaseService<ClusterItem> { 
     ... 
    } 
+1

특정 속성에 액세스하거나 괄호 표기법 '항목을 사용하여 액세스하기 전에 유형을 확인하려면 [유형 가드] (https://www.typescriptlang.org/docs/handbook/advanced-types.html)를 사용할 수 있습니다 [ 'id']' –

+3

아마도'T extends {id : number}', 제네릭 타입을 그 속성을 가진 것으로 제한하기 위해서입니다. – jonrsharpe

답변

2

귀하의 코드가 클래스와 함께 사용되는 모든 종류 Tid 속성을 가질 수 있다고 가정합니다.

귀하의 질문에 대한 그의 의견에서 지적한 바와 같이, 유형 안전성과 표현력면에서 올바른 접근법은이 가정을 유형 제약으로 선언하여 명시 적으로 유형 검사기에 알리는 것입니다.

이 작업을 수행하는 방법은 제네릭 형식 매개 변수에 형식 제약 조건 구문을 사용하는 것입니다.

예를 들어,

export interface MayHaveId { 
    id?: number; // you can use any type, number is just an example 
} 

export abstract class BaseService<T extends MayHaveId> { 
    saveItem(item: T) { 
    if (item.id || id === 0) { 
     console.log(id); 
    } 
    } 
} 

여기 우리가 코드를 더 쉽게 읽을 수 있도록하는 인터페이스를 정의한 쓸 수 있지만, 문자 유형뿐만 아니라 작동합니다.

로직에 값이 필요하지 않으므로 id 속성은 선택 사항으로 선언됩니다.

id이있는 유형 인수 만 사용하여 저음 클래스를 사용하려면 속성을 필수로 설정해야합니다. 이렇게하면 코드를 더 쉽게 이해할 수 있으며 컴파일 타임에 처음부터 이러한 유형에서만 사용되도록 보장하여 더 많은 오류를 잡을 수 있습니다.

관련 문제