
Mike
30.08.2016
16:54:51
ты не наследуешь типы
я говорю о том что при наслдедовании в коллбеках он разрешает в обе стороны приводить, а должен только в одну

Дмитрий
30.08.2016
16:55:50
<T>(callback:(b:T)=>void, b:T)
Я не говорю компилятору заткнуться. Это безграмотное объявление, попросту неверное

Mike
30.08.2016
16:56:13
хорошо а как тогда мне это объявить?

Google

Mike
30.08.2016
16:56:26
естественно это пример из большого проекта
я хочу принять коллбек, и потом вызвать

Vladimir
30.08.2016
16:56:41
Вот
https://www.typescriptlang.org/play/index.html#src=class%20A%20%7B%0D%0A%20%20%20%20public%20propA%3Anumber%20%3D%2010%3B%0D%0A%7D%0D%0A%0D%0Aclass%20B%20extends%20A%20%7B%0D%0A%20%20%20%20public%20propB%3Anumber%20%3D%2015%3B%0D%0A%7D%0D%0A%0D%0Afunction%20runBCallback%3CT%3E(callback%3A(b%3AT)%3D%3Evoid%2C%20b%3AT)%3Avoid%20%7B%0D%0A%09callback(b)%3B%0D%0A%7D%0D%0A%0D%0Alet%20funcWantB%20%3D%20(b%3AB)%20%3D%3E%20alert(b.propB)%3B%0D%0A%0D%0Alet%20button%20%3D%20document.createElement('button')%3B%0D%0Abutton.textContent%20%3D%20%22Say%20Hello%22%3B%0D%0Abutton.onclick%20%3D%20function()%20%7B%0D%0A%20%20%20%20runBCallback(funcWantB%2Cnew%20A())%3B%0D%0A%7D%0D%0A%0D%0Adocument.body.appendChild(button)%3B

Mike
30.08.2016
16:57:30

Vladimir
30.08.2016
16:57:45
слегка упростил для наглядности

Дмитрий
30.08.2016
16:58:01
Вы не так типы объявили
.

Vladimir
30.08.2016
16:58:16
всмысле - не так? объявил как мне надо

Дмитрий
30.08.2016
16:58:30
Ну результат соответствующий)) Ща, 10 минут

Mike
30.08.2016
16:58:39

Vladimir
30.08.2016
16:59:02
https://www.typescriptlang.org/play/index.html#src=%0D%0Aclass%20A%20%7B%7D%0D%0Aclass%20B%20extends%20A%20%7B%7D%0D%0A%0D%0Afunction%20test(fn%3A%20(v%3A%20B)%20%3D%3E%20void)%20%7B%0D%0A%09fn(new%20A)%0D%0A%7D
хм. я удмал классы в тс номинальные

Google

Дмитрий
30.08.2016
17:00:40
Смотрите
https://www.typescriptlang.org/play/index.html#src=class%20A%20%7B%0D%0A%20%20%20%20public%20propA%3Anumber%20%3D%2010%3B%0D%0A%7D%0D%0A%0D%0Aclass%20B%20extends%20A%20%7B%0D%0A%20%20%20%20public%20propB%3Anumber%20%3D%2015%3B%0D%0A%7D%0D%0A%0D%0Afunction%20runBCallback%3CT%2CU%20extends%20T%3E(callback%3A(b%3AU)%3D%3Evoid%2C%20b%3AT)%3Avoid%20%7B%0D%0A%09callback(b)%3B%0D%0A%7D%0D%0A%0D%0Alet%20funcWantB%20%3D%20(b%3AB)%20%3D%3E%20alert(b.propB)%3B%0D%0A%0D%0Alet%20button%20%3D%20document.createElement('button')%3B%0D%0Abutton.textContent%20%3D%20%22Say%20Hello%22%3B%0D%0Abutton.onclick%20%3D%20function()%20%7B%0D%0A%20%20%20%20runBCallback(funcWantB%2Cnew%20A())%3B%0D%0A%7D%0D%0A%0D%0Adocument.body.appendChild(button)%3B

Vladimir
30.08.2016
17:00:45
так, этот пример тогда не о том

Дмитрий
30.08.2016
17:00:51
class A {
public propA:number = 10;
}
class B extends A {
public propB:number = 15;
}
function runBCallback<T,U extends T>(callback:(b:U)=>void, b:T):void {
callback(b);
}
let funcWantB = (b:B) => alert(b.propB);
let button = document.createElement('button');
button.textContent = "Say Hello";
button.onclick = function() {
runBCallback(funcWantB,new A());
}
document.body.appendChild(button);

Mike
30.08.2016
17:01:09

Vladimir
30.08.2016
17:01:25
> Mike
гы, так у тебя расширивший не отличается по сигнатуре, типизация то структураная. добавь свойство в класс B и тут же упадёт всё
думал классы номинальные, как в flow

Дмитрий
30.08.2016
17:01:40
Обращаю ваше внимание, что тут нельзя объявить всё от одного дженерика, только от <T,U extends T>
Опять язык виноват(

Mike
30.08.2016
17:02:05
нет
function runBCallback<T, U extends T> (callback:(b:U)=>void, b:T):void {
callback(b);
}
в принципе не компилится

Дмитрий
30.08.2016
17:03:52
Здорово, правда?)

Mike
30.08.2016
17:04:06
а толку?

Дмитрий
30.08.2016
17:04:15
Ошибка и не компилится, возмутительно!

Mike
30.08.2016
17:04:30
блин речь вообще не о том
сейчас ещё другой пример сделаю

Дмитрий
30.08.2016
17:05:00
Речь о том, что объявлять тип надо так, а не как в ваших примерах, это бессмысленно

Nikita
30.08.2016
17:05:18
как вы редьюсеры пишите на flow/ts?

Vladimir
30.08.2016
17:05:27
вот пример
https://www.typescriptlang.org/play/index.html#src=class%20A%20%7B%0D%0A%7D%0D%0A%0D%0Aclass%20B%20extends%20A%20%7B%0D%0A%20%20%20%20boom()%20%7B%7D%0D%0A%7D%0D%0A%0D%0Alet%20fn%20%3D%20(b%3AB)%20%3D%3E%20%7B%0D%0A%09b.boom()%0D%0A%7D%0D%0A%0D%0Afunction%20test(f%3A%20(f%3A%20(t%3A%20A)%20%3D%3E%20void)%20%3D%3E%20void)%20%7B%0D%0A%20f(fn)%0D%0A%7D
который показывать что тс - говно

Google

Дмитрий
30.08.2016
17:05:48
Это бред
Для этого интерфейсы есть

Vladimir
30.08.2016
17:06:47
С интерфейсами тоже самое

Aleh
30.08.2016
17:07:08
запиши константу строкой

Дмитрий
30.08.2016
17:08:02
С интерфейсами тоже самое
Что - то же самое? Функция, который требуется метод boom будет принимать соответствующий интерфейс и ей вообще будет до лампочки какие там типы
А у тебя опять идёт тавталогия


Mike
30.08.2016
17:08:21
вот пример ближе к реальности
https://www.typescriptlang.org/play/index.html#src=class%20A%20%7B%0D%0A%20%20%20%20public%20propA%3Anumber%20%3D%2010%3B%0D%0A%7D%0D%0A%0D%0Aclass%20B%20extends%20A%20%7B%0D%0A%20%20%20%20public%20propB%3Anumber%20%3D%2015%3B%0D%0A%7D%0D%0A%0D%0Aclass%20FeederWithA%20%7B%0D%0A%09public%20feedCallbackWithA(callback%3A(a%3AA)%20%3D%3E%20void)%3Avoid%20%7B%0D%0A%09%09callback(new%20A())%3B%0D%0A%09%7D%0D%0A%7D%0D%0Alet%20aFeeder%20%3D%20new%20FeederWithA()%3B%0D%0A%0D%0Alet%20button%20%3D%20document.createElement('button')%3B%0D%0Abutton.textContent%20%3D%20%22Say%20Hello%22%3B%0D%0Abutton.onclick%20%3D%20function()%20%7B%0D%0A%20%20%20aFeeder.feedCallbackWithA((b%3AB)%20%3D%3E%20alert(b.propB))%3B%0D%0A%7D%0D%0A%0D%0Adocument.body.appendChild(button)%3B

Nikita
30.08.2016
17:08:31

Aleh
30.08.2016
17:08:42

Nikita
30.08.2016
17:08:47
flow говорит, что payload может быть undefined
и это правда, он может быть undefined
то есть как flow объяснить соответствие типа экшна и данных?

Дмитрий
30.08.2016
17:10:03

Vladimir
30.08.2016
17:10:03
через disjoint union

Aleh
30.08.2016
17:10:22
flow говорит, что payload может быть undefined
https://www.typescriptlang.org/play/index.html#src=type%20Action1%20%3D%20%7B%0D%0A%09type%3A%20%22Action1%22%3B%0D%0A%09field1%3A%20number%3B%0D%0A%7D%0D%0Atype%20Action2%20%3D%20%7B%0D%0A%09type%3A%20%22Action2%22%3B%0D%0A%09field2%3A%20string%3B%0D%0A%7D%0D%0A%0D%0Atype%20Action%20%3D%20Action1%20%7C%20Action2%3B%0D%0A%0D%0Afunction%20reducer(action%3A%20Action)%20%7B%0D%0A%09switch(action.type)%20%7B%0D%0A%09%09case%20%22Action1%22%3A%0D%0A%09%09return%20action.field1%3B%0D%0A%09%09case%20%22Action2%22%3A%0D%0A%09%09return%20action.field2%3B%0D%0A%09%7D%0D%0A%7D
ts 2.0 без ошибок будет


Vladimir
30.08.2016
17:10:25
Вот пример: https://www.typescriptlang.org/play/index.html#src=interface%20A%20%7B%0D%0A%7D%0D%0A%0D%0Ainterface%20B%20%7B%0D%0A%20%20%20%20boom()%3A%20void%0D%0A%7D%0D%0A%0D%0A%0D%0Afunction%20test(fn%3A%20(a%3A%20A)%20%3D%3E%20void)%20%7B%0D%0A%20fn(%7B%7D)%0D%0A%7D%0D%0A%0D%0Avar%20a%3A%20A%20%3D%20%7B%7D%0D%0A%0D%0A%0D%0Avar%20fn%20%3D%20(b%3A%20B)%20%3D%3E%20b.boom()%3B%0D%0A%0D%0Atest(fn)
запустите и посмотрите, что будет

Google

Mike
30.08.2016
17:10:42
я объявил функцию которая хочет B, и скормил в место которое обещает накормить его A, не наоборот
и это скомпилилось

Vladimir
30.08.2016
17:11:48
Вообще это скорее всего баг, даже по меркам тайпскрипта

Nikita
30.08.2016
17:12:48
гм, ну это немного пиздец так описывать)
код превратится в кучу типов и мало смысла

Дмитрий
30.08.2016
17:13:06
Он вообще не правильный теперь!

Vladimir
30.08.2016
17:13:25
неправильный)

Дмитрий
30.08.2016
17:13:41
У вас ложная система типов

Vladimir
30.08.2016
17:13:42

Дмитрий
30.08.2016
17:14:02
Нельзя получить типы просто описав типы!
Пипец) Да вы меня троллите, не бывает так %)

Nikita
30.08.2016
17:14:21
слишком добуя приходится описывать

Vladimir
30.08.2016
17:14:45
магия?

Mike
30.08.2016
17:15:18
У вас ложная система типов
как мне написать такой объект с методом, который получает коллбек, и такй чтобы туда нельзя было передать коллбек который ожидает наследника параметром?

Aleh
30.08.2016
17:15:29
https://github.com/Microsoft/TypeScript/issues/1394

Дмитрий
30.08.2016
17:15:35

Aleh
30.08.2016
17:15:35
вот оно

Google

Nikita
30.08.2016
17:15:41
да не, это все понятно) я просто к тому, что я пока мало пользы от этого вижу

Vladimir
30.08.2016
17:16:12
всмысле, относительно аргументов

Aleh
30.08.2016
17:17:22

Vladimir
30.08.2016
17:17:50
просто аннотации не помогут - здесь просто тупость какая-то

Nikita
30.08.2016
17:18:11
плюс нельзя использовать константы

Vladimir
30.08.2016
17:18:22

Nikita
30.08.2016
17:18:35
а когда захочешь переименовать, чесать репу?

Vladimir
30.08.2016
17:18:47
просто переименовываешь, в чем проблема

Nikita
30.08.2016
17:18:57
в нескольких местах?

Vladimir
30.08.2016
17:19:00
да

Aleh
30.08.2016
17:19:01
тайпчекер же скажет где че

Vladimir
30.08.2016
17:19:13
или ты так хочешь оставить const FOO=‘BAR’?
это тоже как то не очень

Nikita
30.08.2016
17:19:28
ты передергиваешь
переименовать значение переменной, а потом переменную - это одно

Vladimir
30.08.2016
17:19:39
я просто говорю, что это так и так придется сделать

Nikita
30.08.2016
17:19:45
найти все значения - это другое

Vladimir
30.08.2016
17:19:55
за тебя все найдут

Nikita
30.08.2016
17:20:17
еще у flow заметил пиздец тупость
объявлен тип, переменная типа, у переменной не правильный тип