C> {
}
Как работать с дженериком я понял, мы можем сделать
new test<number>
И тогда «А» будет типом number
Но что здесь означает правая часть после extends??
Вот так я понимаю что будет
class test<A extends B> {
}
Мы потребуем, что бы A был наследован от B
Это значит, что тип будет класса B, или унаследованного от него, и по умолчанию будет равен C, если ничего не задано
Нет, A вы будете использовать как указатель на тип внутри класса, например property: A
т.е. без "=", тип А будет класса B или унаследованного от него, но по умолчанию не будет ничем а вот с "=" есть возможность не прописывать тип, по умолчанию он будет B
class Some<A extends B = C> { prop: A; } class B {} class C extends B {} const a1 = new Some(); // a1.prop - будет типа C const a2 = new Some<B>(); // a2.prop - будет типа B
Спасибо большое, я всё проверил, это так Но появился новый вопрос, почему этот код работает ?
Ведь A может быть B или наследоваться от B, как он проглотил вообще какой-то левый инстанс D ??
Потому что по умолчанию в log функцию (которая класс C) вы передаете инстанс объекта D и вызываете у него log. Работать оно будет, т.к. для js код правильный, а вот при компиляции должно ругнуться или выдать предупреждение, посмотрите на вкладках
Тогда странно. А в IDE тоже позволит сделать это? Просто с точки зрения JS код правильный, но при компиляции обычно такие логические ошибки на корню прибиваются. Попробуйте strict режим
Тишина, шторм молчит тоже, можете сами проверить, если интересно class B { log() { console.log("hello B") } } class C extends B { log() { console.log("hello C"); } } class Some<A extends B = C> { log(arg: A) { arg.log(); } } class D { log() { console.log("hello D!! Oy, no no no...."); } } const instanseD = new D(); const some = new Some(); // a1.prop - будет типа C some.log(instanseD);
Ребят, может кто-то может объяснить развёрнуто, почему этот код работает или может есть ссылка на статью по этой теме?
ты хоть some.log({ log: () => {}}) сделай оно ругаться не будет
Обсуждают сегодня