always_specify_types 진단: 명시적 타입 애너테이션이 빠졌을 때

always_specify_types 진단: 명시적 타입 애너테이션이 빠졌을 때

Dart 분석기가 내보내는 진단에는 이름이 있어요. always_specify_types명시적인 타입 애너테이션(type annotation)이 빠졌을 때 분석기가 알려주는 린트(lint) 진단이에요. 코드가 돌아가는 데 문제가 생기는 건 아니지만, 타입을 명시해 두면 의도를 더 분명하게 드러낼 수 있어요.

출처: always_specify_types

본문

설명

분석기는 명시적인 타입 애너테이션이 없을 때 이 진단을 만들어요. 여기에는 다음과 같은 경우가 포함돼요.

  • 특정 타입 없이 var, final, const를 써서 변수를 선언한 경우
  • 함수 매개변수에 타입 애너테이션이 없는 경우
  • 컬렉션 리터럴에 명시적인 타입 인자가 없는 경우
  • 제네릭 클래스, 믹스인, enum을 참조할 때 타입 인자를 지정하지 않은 경우

package:meta@optionalTypeArgs로 애너테이션된 타입은 타입 인자를 요구하지 않는 예외로 취급돼요.

예시

다음 코드는 최상위 변수를 명시적 타입 없이 var로 선언했기 때문에 이 진단이 나와요.

var x = 1;

다음 코드는 매개변수 p에 타입 애너테이션이 없기 때문에 이 진단이 나와요.

void f(p) {}

다음 코드는 집합(set) 리터럴에 명시적인 타입 인자가 없기 때문에 이 진단이 나와요.

Set<int> items = {1, 2};

다음 코드는 제네릭 타입 C를 타입 인자 없이 사용했기 때문에 이 진단이 나와요.

class C<T> {}

C c = C<int>();

흔한 해결 방법

변수 선언에 명시적인 타입 애너테이션을 붙여요.

int x = 1;

매개변수에 타입 애너테이션을 붙여요.

void f(int p) {}

컬렉션 리터럴에 명시적인 타입 인자를 붙여요.

Set<int> items = <int>{1, 2};

제네릭 타입 참조에 타입 인자를 붙여요.

class C<T> {}

C<int> c = C<int>();

타입 인자를 생략하려는 의도라면, 선언을 package:meta@optionalTypeArgs로 애너테이션해서 이 린트에서 제외할 수 있어요.

import 'package:meta/meta.dart';

@optionalTypeArgs
class C<T> {}

C c = C();

더 알아보기