invalid_export_of_internal_element_indirectly 진단: 시그니처를 통해 내부 요소가 간접 노출될 때

invalid_export_of_internal_element_indirectly 진단: 시그니처를 통해 내부 요소가 간접 노출될 때

Dart 분석기가 내보내는 진단에는 이름이 있어요. invalid_export_of_internal_element_indirectly공개 라이브러리가 내부 전용 타입을 시그니처(signature) 일부로 쓰는 함수를 export할 때 분석기가 알려주는 컴파일 타임 진단이에요. 멤버 자체는 아니지만, 그 멤버의 시그니처를 통해 내부 요소가 간접적으로 노출되는 경우예요.

출처: invalid_export_of_internal_element_indirectly

본문

설명

@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 자체를 제거하면 돼요.

더 알아보기