always_specify_types 진단: 명시적 타입 애너테이션이 빠졌을 때
always_specify_types 진단: 명시적 타입 애너테이션이 빠졌을 때
Dart 분석기가 내보내는 진단에는 이름이 있어요. always_specify_types는 명시적인 타입 애너테이션(type annotation)이 빠졌을 때 분석기가 알려주는 린트(lint) 진단이에요. 코드가 돌아가는 데 문제가 생기는 건 아니지만, 타입을 명시해 두면 의도를 더 분명하게 드러낼 수 있어요.
본문
설명
분석기는 명시적인 타입 애너테이션이 없을 때 이 진단을 만들어요. 여기에는 다음과 같은 경우가 포함돼요.
- 특정 타입 없이
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();