-
Notifications
You must be signed in to change notification settings - Fork 66
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Модификаторы вариантности могут изменять правила совместимости типов #198
Comments
@bgenia а это разве не баг? Сейчас вечер и я жутко устал, но мне кажется, что компилятор просто не берет в расчет не задействованный параметр. |
@nauchikus Это не баг, это бивариантное поведение. Незадействовааный параметр считается бивариантным, так как его тип не влияет на структурную совместимость результирующих типов. Далее я показал пример что с помощью аннотаций можно сузить вариантность такого параметра. Вот другой пример действия аннотаций: // Как известно, параметры методов являются бивариантными даже при включенной strictFunctionTypes
// Такое поведение может приводить к ошибкам
type Example<T> = { f(arg: T): void }
declare let vsub: Example<1>
declare let vsuper: Example<1 | 2>
// Присваивание в обе стороны возможно
vsub = vsuper
vsuper = vsub // Контравариантность можно задать искусственно с помощью аннотации in
type Example<in T> = { f(arg: T): void }
declare let vsub: Example<1>
declare let vsuper: Example<1 | 2>
vsub = vsuper
vsuper = vsub // ошибка |
В разделе "Обобщения / Модификаторы вариантности параметров типа in и out" говорится:
На самом же деле, модификаторы вариантности могут сужать вариантность, но не могут её расширять или менять на противоположную. То есть, если параметр типа автоматически выводится ковариантным, мы можем сделать его инвариантным, но не можем сделать бивариантным или контравариантным. Бивариантному параметру можно установить любую желаемую вариантность.
Пример:
Если нужно, могу привести реальные примеры в которых это позволяет избежать ошибок.
The text was updated successfully, but these errors were encountered: