@redeclare가 재선언할 대상이 없는 멤버
@redeclare가 재선언할 대상이 없는 멤버 (redeclare_on_non_redeclaring_member)
이 문서는 Dart 분석기(analyzer)가 내는 redeclare_on_non_redeclaring_member 진단(diagnostic)을 설명하는 문서예요. extension type의 멤버에 @redeclare 애너테이션을 달았는데, 실제로 같은 이름의 멤버가 구현한 인터페이스에 없을 때 분석기가 알려 줘요. 어떤 상황에서 발생하고 어떻게 고치는지 함께 알아볼게요.
본문
진단 메시지
The {0} doesn't redeclare a {0} declared in a superinterface.
{0}은(는) 수퍼인터페이스에 선언된 {0}을(를) 재선언하는 게 아니에요.
설명
분석기는 extension type의 어떤 멤버가 @redeclare로 애너테이션되었는데, 구현한 인터페이스들 중 어디에도 같은 이름의 멤버가 없을 때 이 진단을 만들어 내요. @redeclare가 원래 '수퍼인터페이스의 멤버를 가려서 다시 선언한다'는 뜻이니까, 재선언할 대상이 없으면 애너테이션의 의미가 없어지거든요.
예시
다음 코드는 extension type E가 선언한 멤버 n에 @redeclare가 붙어 있는데, C에는 n이라는 이름의 멤버가 없기 때문에 이 진단을 만들어 내요.
import 'package:meta/meta.dart';
class C {
void m() {}
}
extension type E(C c) implements C {
@redeclare
void n() {}
}
일반적인 해결 방법
애너테이션된 멤버의 이름이 맞다면, 애너테이션을 제거하면 돼요.
class C {
void m() {}
}
extension type E(C c) implements C {
void n() {}
}
만약 이 멤버가 구현한 인터페이스의 멤버를 대체하려는 목적이었다면, 애너테이션된 멤버의 이름을 대체하려는 멤버와 같게 바꿔 주세요.
import 'package:meta/meta.dart';
class C {
void m() {}
}
extension type E(C c) implements C {
@redeclare
void m() {}
}
더 알아보기
- Dart 분석기 진단 목록에서 다른 진단들도 함께 살펴보세요.
- extension type과
@redeclare의 쓰임은 Dart 공식 문서의 extension type 문서를 참고해요.