프로그래밍프론트엔드 개발자

메서드 체이닝(Method Chaining)에서 this의 타입화 원리를 설명하세요. 상속 및 메서드 재정의에서 올바른 타입화를 유지하려면 어떻게 해야 합니까?

Hintsage AI 어시스턴트로 면접 통과

답변.

TypeScript에서 this의 올바른 타입화는 메서드 체이닝 패턴을 지원하는 데 매우 중요합니다. 이 패턴에서는 메서드가 연속 호출을 위해 this를 반환합니다. 반환 값의 타입을 명시하지 않으면 TypeScript는 기본적으로 반환된 객체를 현재 클래스의 인스턴스로 간주하는데, 상속 시에는 이것이 잘못됩니다.

이 문제를 해결하기 위해 **다형성 this(Polymorphic this types)**를 사용합니다:

class Builder { value: number = 0; setValue(v: number): this { this.value = v; return this; } } class AdvancedBuilder extends Builder { multiply(factor: number): this { this.value *= factor; return this; } } const b = new AdvancedBuilder().setValue(5).multiply(2); // multiply가 올바르게 보임

반환된 타입 this는 기본 클래스뿐만 아니라 자식 클래스에서도 메서드 체인이 올바르게 타입화되도록 보장합니다.

함정 질문.

반환 값 타입으로 this 대신 클래스 이름(예: Builder)을 사용하는 것이 가능합니까? 이게 자식의 메서드 체인에 어떤 영향을 미칠까요?

답변:

Builder를 this 대신 반환하면:

class Builder { setValue(v: number): Builder { //... return this; } } class AdvancedBuilder extends Builder { multiply(factor: number): this { // ... return this; } } const a = new AdvancedBuilder().setValue(2).multiply(2); // multiply를 볼 수 없음!

setValue가 Builder를 반환하므로 multiply가 setValue 이후에 사용 불가능합니다. 메서드 시그니처에서 this만이 메서드 체인에서 올바른 타입화를 유지합니다.

주제에 대한 실제 오류 사례


스토리

개발 팀에서 설정 구성을 위한 플루언트 API를 만들었습니다. 메서드에서 기본 클래스의 타입을 반환하여 이를 좋은 관행으로 간주했습니다. 자식이 등장한 이후 플루언트 API의 모든 추가 메서드는 표준 호출 체인 후에 보이지 않게 되었습니다. 결과: API를 this로 리팩토링해야 했고, 클라이언트가 확장을 사용할 수 있도록 했습니다.


스토리

내부 데코레이터 라이브러리에서 명시적으로 특정 클래스 타입을 반환했습니다. 사용자들은 자식들을 사용할 때 새로운 메서드에 접근할 수 없어 "object has no method ..."라는 오류를 겪었습니다. 이 오류는 새로운 서비스와 통합할 때 발생했습니다.


스토리

개발자가 오래된 C# API에서 메서드를 복사하면서 메서드 체인을 TypeScript로 작성했는데 클래스 이름을 반환했습니다. 빌드 단계에서는 모두 정상으로 보였지만 사용자 자식에서 새로운 메서드가 사라졌습니다. tsconfig의 엄격한 검사가 이 문제를 빠르게 찾아내는 데 도움이 되었고, 이를 반환된 this로 수정했습니다.