invalid_use_of_type_outside_library — 클래스 한정자로 제한된 타입을 라이브러리 밖에서 사용

invalid_use_of_type_outside_library — 클래스 한정자로 제한된 타입을 라이브러리 밖에서 사용

extends, implements, with, on 절에서 클래스나 mixin을, 그 선언에 붙은 한정자(modifier)가 허용하지 않는 방식으로 사용하면 나타나는 진단이에요. base·final·sealed·interface 같은 한정자가 어떤 제약을 거는지 함께 살펴볼게요.

출처: invalid_use_of_type_outside_library

본문

분석기는 extends, implements, with, 혹은 on 절이 클래스나 mixin을, 해당 선언에 붙은 한정자(예: base, final, sealed, interface)가 허용하지 않는 방식으로 사용할 때 이 진단을 내보내요.

진단 메시지는 선언이 어떻게 사용됐고, 왜 허용되지 않는지 구체적으로 알려줘요. 그래서 메시지를 잘 읽으면 어느 부분이 제약에 걸렸는지 바로 파악할 수 있어요.

예시

먼저 a.dart 파일에 base 클래스 A가 정의돼 있다고 해볼게요.

base class A {}

그런데 아래 코드처럼 클래스 B가 클래스 Aimplements하면 진단이 터져요. 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 등 한정자의 차이를 이해하면 이 진단뿐 아니라 클래스 설계 자체가 훨씬 수월해져요.