발표는 먼저 ‘타입 내로잉(Type Narrowing)’과 ‘타입 가드(Type Guard)’ 개념을 정의합니다. 타입 내로잉은 변수 타입을 구체적으로 한정하는 과정이며, 타입 가드는 이에 사용되는 표현식입니다. Steep은 if/else
제어 흐름 및 is_a?
같은 빌트인 메서드를 통한 타입 가드를 지원합니다.
첫 번째 주요 기능인 ‘Type for Union Types’는 ActiveSupport
의 present?
같은 메서드가 타입 가드 역할을 하도록 Steep이 인식하는 기능입니다. 세 가지 조건(메서드 호출, 변수/순수 메서드 호출 리시버, 유니온 타입 리시버)을 만족할 때, 메서드 반환 값에 따라 리시버 타입을 좁힙니다. 이 기능은 이미 Steep 1.10에 반영되어 present?
, blank?
등 ActiveSupport 메서드에 적용되었습니다.
두 번째 ‘User-defined Type Guards’는 개발자가 직접 정의한 메서드를 타입 가드로 활용하는 기능입니다. 예를 들어, User
클래스의 admin?
메서드가 true
반환 시 AdminUser
타입으로 좁히는 경우에 유용합니다. RBS 타입 정의 시 해당 메서드에 @A[guard: self.is_admin_user]
와 같은 어노테이션을 추가하여 좁힘 규칙을 명시합니다. 현재 개발 중이며 self.is_type
형태의 술어만 지원합니다. 주요 제약 사항은 타입을 ‘확장’이 아닌 ‘좁히는’ 역할만 하며, else
블록에서의 타입 계산이 항상 성공적이지 않을 수 있다는 점입니다. 그럼에도 불구하고, 이 기능은 ActiveRecord
의 delegated_type
이나 validation
같은 복잡한 조건부 타입 검사를 구현하고, 향후 RBS Rails와 통합되어 개발 편의성을 크게 향상시킬 잠재력이 있습니다.