`unrelated_type_equality_checks` 린트 규칙: 관계없는 타입의 동등성 비교
unrelated_type_equality_checks 린트 규칙: 관계없는 타입의 동등성 비교
unrelated_type_equality_checks는 서로 아무 관련이 없는 타입의 참조를 ==로 비교할 때 Dart 분석기가 알려주는 린트 규칙이에요. 둘 중 하나가 다른 하나의 하위 타입(subtype)도 아닌데 비교하는 것은 보통 false를 반환하고, 개발자가 의도한 것과 다를 가능성이 높아요.
본문
설명
관계없는 타입의 참조를 동등성 비교하지 마세요. 서로 하위 타입 관계가 없는 타입을 비교하면 대부분 false가 나오는데, 이게 프로그래머의 의도를 반영하지 못할 수 있어요.
조금 특별한 경우가 있어요. package:fixnum의 Int64와 Int32는 int와의 비교를 허용하는데, 이때는 int가 오른쪽에 있을 때만 가능해요. 이 린트는 그런 경우를 특별히 허용하고 있어요.
BAD:
void someFunction() {
var x = '1';
if (x == 1) print('someFunction'); // LINT
}
String인 x와 int인 1을 비교하니 린트가 걸려요.
void someFunction1() {
String x = '1';
if (x == 1) print('someFunction1'); // LINT
}
명시적으로 String 타입을 써도 String과 int는 관계가 없으니 여전히 린트예요.
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 {}
DerivedClass2와 DerivedClass3는 둘 다 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.length는 int라서 0과 비교해도 괜찮아요.
void someFunction8(ClassBase instance) {
DerivedClass1 other;
if (other == instance) print('someFunction8'); // OK
}
DerivedClass1은 ClassBase의 하위 타입이라서 비교가 허용돼요.
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 {}
DerivedClass2가 Mixin을 구현하듯 동작하니 비교가 가능해요. 여기서는 Mixin 타입 위치와 DerivedClass2 타입 위치가 서로 비교가 허용되는 관계예요.
활성화하기
unrelated_type_equality_checks 규칙을 켜려면 analysis_options.yaml 파일의 linter > rules에 unrelated_type_equality_checks를 추가해요.
linter:
rules:
- unrelated_type_equality_checks
YAML 맵 문법을 쓴다면 linter > rules 아래에 unrelated_type_equality_checks: true를 넣으면 돼요.
linter:
rules:
unrelated_type_equality_checks: true