169 похожих чатов

Https://Www.Typescriptlang.Org/Play?#Code/PTAEDsHsBdQd0gJwNYGcBQBLAtgBybAFSgCGqoASgKYkDGsAZopNqAOSI31sDc6W4aFUQM6VSgFcANlQA8AFQCSQ7AD5QAb3SgdoTABMAXKFTREmcAHM+U0NhK5j1OtAB0AYRb5wVQfICeuHIaJIiWxkoqAL6qfFH8DBLg9JiQ4HpCiCRCCspUagAUmCqoTjT6aVL+AIKIWf65KqoANKCI0lSllOWVNXUkDRQdjfmqqgCUmvHotGmmbR2gALya2roGxgBEAIybzWs69o6gBSFhUZNL6rL6mABuqqGWriSywLcP+1Gk5EMysiFjOAJNgAEbCGL8YrCbLBEhAkHgxCtUHGUzmKwxAoAbUBoG2KOMbAATGwogBdVrY9oycnjPjoEDwJBoKGCYSiWjiP5UbYjNSrWwbExmCzWA52BzGApPCJ5bCXdTAsHCOIJJIpNIZGFCPmRUZFEplEgVcBVWr1fktBYyLrOU3m-QDDp6+VjSYaaazcDzGm85aC9ZGUA7PYSo7Sp6K0hhF5fH6SGR8vHKpGQrCZWHJ+EQRHCQkijGWLG4nME0Co9ikilUv3bOk8IA Поясните что не так, пожалуйста. Эквивалентный код, но не могу

понять почему верхний пример не работает, а нижний спокойно работает

1 ответов

30 просмотров

Разница в том, что в верхнем примере интерфейс Rule<TItem> зависит от своего типа-параметра TItem и ковариантно, и контрвариантно (поскольку ковариантно и контрвариантно зависит от T тип React.ComponentType<T>, через который проходит параметр TItem в Rule<TItem>). Ковариантная зависимость G<T> от T означает, что из S extends T (тип S является подтипом T) следует G<S> extends G<T> (для любых допустимых S и T). Контрвариантная зависимость G<T> от T означает, что из S extends T следует G<T> extends G<S>. Таким образом, функция iterate из верхнего примера, принимая тип-параметр TItem, будет требовать, чтобы её второй аргумент был массивом элементов Rule<T>, где одновременно T extends TItem (из-за ковариантности), и TItem extends T (из-за контрвариантности), то есть типы T и TItem фактически должны совпадать (в то время как TItem = {a: number, b: string}, а T = {a: number}, и TS фиксирует ошибку). В нижнем же примере интерфейс Rule1<TItem> зависит от TItem только контрвариантно (так как TItem входит в интерфейс только на позиции аргумента одного из методов), поэтому функция iterate1, принимая тип-параметр TItem, будет требовать лишь, чтобы её второй аргумент был массивом элементов Rule1<T>, где TItem extends T (что и выполняется при TItem = {a: number, b: string} и T = {a: number}). Тут можно посмотреть цепочки проверок типов в верхнем и нижнем примерах подробнее: play.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта