타입 어노테이션을 명시해요

타입 어노테이션을 명시해요

top-level 선언이나 클래스 멤버는 슈퍼 인터페이스나 초기화식에서 타입을 추론할 수 없는 경우가 있어요. 그럴 때 타입을 빼먹으면 조용히 dynamic으로 처리되니, 타입을 명시해 주는 게 안전합니다.

출처: strict_top_level_inference

본문

슈퍼 인터페이스나 초기화식에서 타입이 추론되지 않는 top-level 및 클래스형 멤버 선언에는 타입을 명시하세요.

이 린트는 top-level 선언이나 클래스형 네임스페이스 수준 선언(static·instance 멤버 또는 생성자 선언)에서 빠뜨린 모든 반환 타입, 매개변수 타입, 변수 타입 중에서 추론으로 타입이 정해지지 않아 결과적으로 dynamic으로 기본 설정되는 경우를 경고해요.

top-level 추론으로 타입이 정해질 수 있는 생략 타입은 오직 초기화식을 가진 변수 선언의 타입과, 일관된 결합 슈퍼 인터페이스 시그니처를 오버라이드하는 instance 멤버의 반환·매개변수 타입뿐이에요.

Setter는 항상 void로 간주되므로 반환 타입이 필요 없어요.

나쁜 예:

var _zeroPointCache;
class Point {
  get zero => ...;
  final x, y;
  Point(x, y) {}
  closest(b, c) => distance(b) <= distance(c) ? b : c;
  distance(other) => ...;
}
_sq(v) => v * v;

좋은 예:

Point? _zeroPointCache;
class Point {
  Point get zero => ...;
  final int x, y;
  Point(int x, int y) {}
  closest(Point b, Point c) =>
      distance(b) <= distance(c) ? b : c;
  distance(Point other) => ...;
}
int _sq(int v) => v * v;

활성화 방법

strict_top_level_inference 규칙을 사용하려면 analysis_options.yaml 파일의 linter > rules 아래에 strict_top_level_inference를 추가하면 돼요:

linter:
  rules:
    - strict_top_level_inference

린트 규칙을 YAML 맵 문법으로 설정한다면, linter > rules 아래에 strict_top_level_inference: true를 추가하면 되고요:

linter:
  rules:
    strict_top_level_inference: true

더 알아보기