avoid_type_to_string
avoid_type_to_string
프로덕션 코드에서는 타입을 문자열로 바꿔 비교하는 방식이 위험할 수 있어요. 릴리스 빌드에서 심볼 이름이 축약되면 원하는 결과가 나오지 않거든요. avoid_type_to_string 린트 규칙이 왜 이런 경우를 막아주는지 함께 살펴볼게요.
본문
상태: 안정(stable) · 출시: Dart 2.12
프로덕션 코드에서는 Type 값에 .toString()을 호출하지 마세요. toString()은 계약상 Type(또는 그 기반 클래스)의 사용자 정의 이름을 반환한다고 보장하지 않아요. 코드 크기를 신경 쓰지 않는 개발 모드 컴파일러는 전체 심볼 이름을 사용하지만, 릴리스 모드 컴파일러는 이 심볼들을 축약(minify)하는 경우가 많아요. 그 결과 같은 타입이라도 환경에 따라 문자열 값이 달라질 수 있으니, 문자열 비교로 타입을 판별하는 건 의존하기 어려운 방법이에요.
나쁜 예
void bar(Object other) {
if (other.runtimeType.toString() == 'Bar') {
doThing();
}
}
Object baz(Thing myThing) {
return getThingFromDatabase(key: myThing.runtimeType.toString());
}
좋은 예
타입이 정확히 같은지 확인해야 할 때는 타입 검사(is)를 쓰고, 문자열 키가 필요하다면 타입 이름 대신 안정적인 별도 속성을 사용하세요.
void bar(Object other) {
if (other is Bar) {
doThing();
}
}
class Thing {
String get thingTypeKey => ...;
}
Object baz(Thing myThing) {
return getThingFromDatabase(key: myThing.thingTypeKey);
}
규칙 활성화하기
analysis_options.yaml 파일의 linter > rules 아래에 avoid_type_to_string을 추가하면 돼요.
linter:
rules:
- avoid_type_to_string
룰을 YAML 맵 문법으로 설정하고 있다면 linter > rules 아래에 avoid_type_to_string: true를 넣어 주세요.
linter:
rules:
avoid_type_to_string: true