invalid_export_of_internal_element_indirectly 진단: 시그니처를 통해 내부 요소가 간접 노출될 때
invalid_export_of_internal_element_indirectly 진단: 시그니처를 통해 내부 요소가 간접 노출될 때
Dart 분석기가 내보내는 진단에는 이름이 있어요. invalid_export_of_internal_element_indirectly는 공개 라이브러리가 내부 전용 타입을 시그니처(signature) 일부로 쓰는 함수를 export할 때 분석기가 알려주는 컴파일 타임 진단이에요. 멤버 자체는 아니지만, 그 멤버의 시그니처를 통해 내부 요소가 간접적으로 노출되는 경우예요.
본문
설명
@internal 애너테이션으로 표시된 타입을 반환 타입이나 매개변수 타입 중 하나로 쓰는 최상위 함수를 공개 라이브러리가 export할 때 분석기는 이 진단을 만들어요. 함수 자체는 공개되지만, 그 함수를 호출하려면 내부 전용 타입을 드러내야 하기 때문이에요.
예시
src 디렉터리의 a.dart 파일에 다음 내용이 있다고 해 볼게요.
import 'package:meta/meta.dart';
@internal
typedef IntFunction = int Function();
int f(IntFunction g) => g();
아래 코드는 f가 내부에서만 쓰려고 한 IntFunction 타입의 매개변수를 받기 때문에 이 진단이 나와요.
export 'src/a.dart' show f;
흔한 해결 방법
함수를 공개로 둬야 한다면, 함수 시그니처에 쓰인 모든 타입을 공개 타입으로 만들면 돼요.
함수를 export할 필요가 없다면 export를 멈춰요. show 절에서 제거하거나, hide 절에 추가하거나, export 자체를 제거하면 돼요.