Phantom types — это generic типы, где параметр типа существует только на уровне компиляции — он никогда не хранится как свойство во время выполнения. Это позволяет компилятору обеспечивать различие типов, которое иначе было бы невидимым.
Рассмотри такое определение:
struct Identifier<T> {
let value: String
}
Параметр типа T не используется ни в каких хранимых свойствах. Это phantom — присутствует в сигнатуре типа, но отсутствует в памяти.
Несмотря на это, компилятор обрабатывает следующее как совершенно разные типы:
let userID: Identifier<User> = Identifier(value: "123")
let postID: Identifier<Post> = Identifier(value: "123")
postID туда, где ожидается Identifier<User>, вызывает ошибку на этапе компиляцииStringPhantom types позволяют тебе закодировать семантику прямо в систему типов. Вместо того чтобы полагаться на соглашения об именовании или документацию, компилятор автоматически обеспечивает корректность. Это особенно полезно для:
Measurement<Meters> против Measurement<Seconds>)Input<Raw> против Input<Sanitized>)Фантомные типы требуют, чтобы параметр обобщённого типа был сохранён как минимум в одном свойстве структуры для корректной работы.
Новый — ещё не проверен сообществом
Вы