invalid_use_of_type_outside_library — 클래스 한정자로 제한된 타입을 라이브러리 밖에서 사용
invalid_use_of_type_outside_library — 클래스 한정자로 제한된 타입을 라이브러리 밖에서 사용
extends, implements, with, on 절에서 클래스나 mixin을, 그 선언에 붙은 한정자(modifier)가 허용하지 않는 방식으로 사용하면 나타나는 진단이에요. base·final·sealed·interface 같은 한정자가 어떤 제약을 거는지 함께 살펴볼게요.
본문
분석기는 extends, implements, with, 혹은 on 절이 클래스나 mixin을, 해당 선언에 붙은 한정자(예: base, final, sealed, interface)가 허용하지 않는 방식으로 사용할 때 이 진단을 내보내요.
진단 메시지는 선언이 어떻게 사용됐고, 왜 허용되지 않는지 구체적으로 알려줘요. 그래서 메시지를 잘 읽으면 어느 부분이 제약에 걸렸는지 바로 파악할 수 있어요.
예시
먼저 a.dart 파일에 base 클래스 A가 정의돼 있다고 해볼게요.
base class A {}
그런데 아래 코드처럼 클래스 B가 클래스 A를 implements하면 진단이 터져요. base 한정자는 A가 정의된 라이브러리 밖에서 implements되는 걸 막기 때문이에요.
import 'a.dart';
final class B implements A {}
흔한 해결 방법
이 타입의 사용은 선언된 라이브러리 밖에서 제한돼 있어요. 만약 비슷한 기능을 제공하면서 제약이 없는 다른 타입을 쓸 수 있다면, 그 타입으로 바꿔 주면 돼요.
class B implements C {}
class C {}
적당한 다른 타입이 없다면, 타입을 제거하고 경우에 따라 절(clause) 전체를 지워버리는 방법도 있어요.
class B {}
이렇게 하면 A를 전혀 사용하지 않으니 제약이 걸릴 일이 없어요.
더 알아보기
- 클래스 한정자(
base,final,sealed,interface등)가 각각 어떤 상속·구현을 허용하는지는 Dart 언어 투어 — 클래스 한정자 문서를 꼭 확인해 보세요. - sealed, interface, base 등 한정자의 차이를 이해하면 이 진단뿐 아니라 클래스 설계 자체가 훨씬 수월해져요.