`unrelated_type_equality_checks` 린트 규칙: 관계없는 타입의 동등성 비교

unrelated_type_equality_checks 린트 규칙: 관계없는 타입의 동등성 비교

unrelated_type_equality_checks서로 아무 관련이 없는 타입의 참조를 ==로 비교할 때 Dart 분석기가 알려주는 린트 규칙이에요. 둘 중 하나가 다른 하나의 하위 타입(subtype)도 아닌데 비교하는 것은 보통 false를 반환하고, 개발자가 의도한 것과 다를 가능성이 높아요.

출처: unrelated_type_equality_checks

본문

설명

관계없는 타입의 참조를 동등성 비교하지 마세요. 서로 하위 타입 관계가 없는 타입을 비교하면 대부분 false가 나오는데, 이게 프로그래머의 의도를 반영하지 못할 수 있어요.

조금 특별한 경우가 있어요. package:fixnumInt64Int32int와의 비교를 허용하는데, 이때는 int오른쪽에 있을 때만 가능해요. 이 린트는 그런 경우를 특별히 허용하고 있어요.

BAD:

void someFunction() {
  var x = '1';
  if (x == 1) print('someFunction'); // LINT
}

Stringxint1을 비교하니 린트가 걸려요.

void someFunction1() {
  String x = '1';
  if (x == 1) print('someFunction1'); // LINT
}

명시적으로 String 타입을 써도 Stringint는 관계가 없으니 여전히 린트예요.

void someFunction13(DerivedClass2 instance) {
  var other = DerivedClass3();

  if (other == instance) print('someFunction13'); // LINT
}

class ClassBase {}

class DerivedClass1 extends ClassBase {}

abstract class Mixin {}

class DerivedClass2 extends ClassBase with Mixin {}

class DerivedClass3 extends ClassBase implements Mixin {}

DerivedClass2DerivedClass3는 둘 다 ClassBase에서 왔지만 서로 하위 타입 관계는 아니에요. 그래서 비교하려는 의도가 애매해서 린트가 걸려요.

GOOD:

void someFunction2() {
  var x = '1';
  var y = '2';
  if (x == y) print(someFunction2); // OK
}

같은 String끼리 비교하니 괜찮아요.

void someFunction3() {
  for (var i = 0; i < 10; i++) {
    if (i == 0) print(someFunction3); // OK
  }
}

둘 다 int라서 괜찮아요.

void someFunction4() {
  var x = '1';
  if (x == null) print(someFunction4); // OK
}

null과의 비교는 항상 허용돼요.

void someFunction7() {
  List someList;

  if (someList.length == 0) print('someFunction7'); // OK
}

someList.lengthint라서 0과 비교해도 괜찮아요.

void someFunction8(ClassBase instance) {
  DerivedClass1 other;

  if (other == instance) print('someFunction8'); // OK
}

DerivedClass1ClassBase의 하위 타입이라서 비교가 허용돼요.

void someFunction10(unknown) {
  var what = unknown - 1;
  for (var index = 0; index < unknown; index++) {
    if (what == index) print('someFunction10'); // OK
  }
}

unknown 타입과 관련된 비교는 확실하지 않으니 괜찮아요.

void someFunction11(Mixin instance) {
  var other = DerivedClass2();

  if (other == instance) print('someFunction11'); // OK
  if (other != instance) print('!someFunction11'); // OK
}

class ClassBase {}

abstract class Mixin {}

class DerivedClass2 extends ClassBase with Mixin {}

DerivedClass2Mixin을 구현하듯 동작하니 비교가 가능해요. 여기서는 Mixin 타입 위치와 DerivedClass2 타입 위치가 서로 비교가 허용되는 관계예요.

활성화하기

unrelated_type_equality_checks 규칙을 켜려면 analysis_options.yaml 파일의 linter > rulesunrelated_type_equality_checks를 추가해요.

linter:
  rules:
    - unrelated_type_equality_checks

YAML 맵 문법을 쓴다면 linter > rules 아래에 unrelated_type_equality_checks: true를 넣으면 돼요.

linter:
  rules:
    unrelated_type_equality_checks: true

더 알아보기