@typescript_ru

Страница 652 из 669
Сергей
14.06.2018
14:38:20
да так можно о чем угодно говорить

kana
14.06.2018
14:38:30
мы в компайлтайме говорим, что этот код никогда не выполнится

Сергей
14.06.2018
14:38:47
ооок

чет это выглядит как-то абсурдно

Google
kana
14.06.2018
14:39:06
даже больше скажу

есть функция absurd : never -> a

Сергей
14.06.2018
14:39:19
funtion f(): number | never

и че будет

kana
14.06.2018
14:39:33
отдает значение ЛЮБОГО ТИПА, если ты передашь ей never

Aleh
14.06.2018
14:39:37
ну это тоже самое, что f(): number

kana
14.06.2018
14:39:40
Сергей
14.06.2018
14:39:53
kana
14.06.2018
14:39:58
funtion f(): number | never
смотри, давай определим полукольцо типов

Сергей
14.06.2018
14:40:01
то есть эксепшен пометить нельзя

то есть вы считаете, что вводить тип, с другим поведением, для одного кейса, было разумно?

Aleh
14.06.2018
14:41:03
иметь ноль для суммы типов вообще говоря полезно)

Сергей
14.06.2018
14:41:25


Google
Сергей
14.06.2018
14:41:39
а бля

Aleh
14.06.2018
14:41:41
empty же в flow

Сергей
14.06.2018
14:41:56
да ну нахуй

я чет понял, что писать в жс на таких типах — абсурд

будь это хаскель, окамл или ризон, да

но жиквери типизировать

kana
14.06.2018
14:43:27
у нас есть моноид (Type, |, empty) то есть мы можем суммировать любые типы, empty/never - нейтральный элемент (то есть x | empty = x = empty | x) у нас есть дуальный моноид (Type, Pair, void) мы можем перемножать (делать кортежи) любых типов, при этом [x, void] = x = [void, x] есть дистрибутивность: [(a | b), c] = [a, c] | [b, c] есть закон закон пересечения моноидов: x * empty = empty = empty * x все это можно понять, если заменить операции и значения на привычные тебе: | = + [,] = * empty = 0 void = 1

Сергей
14.06.2018
14:43:32
и какой толк описывать функцию которую невозможно вызвать?

kana
14.06.2018
14:43:44
Сергей
14.06.2018
14:43:57
пример - редьюсер, когда нет экшонов
смысл от такого редюсера?

kana
14.06.2018
14:44:22
а описать-то его нужно например, или передать, или еще для чего

kana
14.06.2018
14:44:49
в элме такие кейсы возникают например когда нужно в рендере сделать верстку, которая никогда не вызовет экшонов (Html Never)

или промис который никогда не упадет (и мы об этом знаем статически) (если бы мы типизировали обе ветки)

Promise<empty, x>

empty кажется бессмысленным точно так же, как id кажется бессмысленной функцией

Aleh
14.06.2018
14:46:07
и какой толк описывать функцию которую невозможно вызвать?
ее возможно вызвать, она никогда ничего не вернет

kana
14.06.2018
14:46:10
а используется id довольно часто

Aleh
14.06.2018
14:46:44
а, это absurd называется да)

Google
Sergey
14.06.2018
14:46:48
откуда начинать читать?)

kana
14.06.2018
14:46:51
ну не конкетно такая

абсурд это когда еще возвращаем любой тип

Сергей
14.06.2018
14:47:09
kana
14.06.2018
14:47:22
function absurd<T>(x: never): T { throw "absurd"; }

Сергей
14.06.2018
14:47:29
абсурд это когда еще возвращаем любой тип
но в итоге, мы не можешь протипизировать весь жс

kana
14.06.2018
14:47:55
const x: number = switch ((x : 1)) { case 1: 1; case 2: absurd(x); }

типа это значение x абсрудно и мы говорим об этом компилятору

Сергей
14.06.2018
14:51:40
в чем суть

kana
14.06.2018
14:52:57
ну конкретно в этом примере я показал для наглядности

но сам часто использую абсурд в default

чтобы потом когда тип расширится, компилятор мне скзаал, что тут ожидается never, а получен 10, добавь кейс

Сергей
14.06.2018
14:53:45
ну для number это не работает ж

для каких нибудь enum может быть

но я уловил

это костыль

Eugene
14.06.2018
14:54:35
тс - это костыль

Сергей
14.06.2018
14:54:40
часть кейсов с тем же switch и never должны срезаться когда появится паттерн матчинг

Алексей
14.06.2018
14:54:47
Google
Eugene
14.06.2018
14:54:53
Сергей
14.06.2018
14:54:54
жс — костыль

если уж на то пошло

Oleg
14.06.2018
14:55:08
+
flow - не нужен, как и js

Алексей
14.06.2018
14:55:18
жс — костыль
ну не совсем

Сергей
14.06.2018
14:55:19
Oleg
14.06.2018
14:55:23
го в пыхе шаблоны рендерить

Сергей
14.06.2018
14:55:29
ну не совсем
у нас альтернатив нет, поэтому ситуация такая

Алексей
14.06.2018
14:55:42
костыль не сам жс, а как раз его безальтернативность

Eugene
14.06.2018
14:55:43
на котлине нормальный аналог jsx говорят люди

Сергей
14.06.2018
14:56:19
с чего бы
потому что тогда можно будет с помощью типизации чекать непроверенные ветки

и конкретно этот кейс уйдет в небытие

Aleh
14.06.2018
14:57:02
это костыль
в ТК это важный тип, не костыль. Точнее настолько же костыль, насколько число 0 костыль

Artur
14.06.2018
14:58:13
А я вот использовал тип {} там где хотел unknown

Aleh
14.06.2018
14:58:32
Artur
14.06.2018
14:58:58
я делал {} | undefined | null
У меня просто до сих пор strictNullCheck=false (

Google
Aleh
14.06.2018
14:59:03
О.О

Сергей
14.06.2018
14:59:05
как?
также как в расте

Сергей
14.06.2018
14:59:22
лол

kana
14.06.2018
14:59:25
это то самое верное алгебраичное решение проверки на тип

Aleh
14.06.2018
14:59:26
также как в расте
прости, я только хеллоуворлды осилил и простенькие процесс-менеджеры

поэтому покажи)

Сергей
14.06.2018
14:59:28
я кажется снова перестал понимать

Artur
14.06.2018
14:59:40
но если strictNullChecks то оно и без absurd() корректно ругнётся,т не так ли?

Сергей
14.06.2018
14:59:56
absurd - не костыль
и как он зовется в нормальных функциональных языках?

kana
14.06.2018
15:00:00
absurd активно используют в пруверах например

так и называется

Сергей
14.06.2018
15:00:03
точнее как это в том же хаскеле выглядит

Aleh
14.06.2018
15:00:14
absurd :: Void -> a

kana
14.06.2018
15:00:18
absurd :: Void -> a absurd x = case x of {}

Artur
14.06.2018
15:00:35
Aleh
14.06.2018
15:00:57
Unit эт другое, хотя хз как в скале

kana
14.06.2018
15:01:04
юнит - это у типа есть одно значение

и поэтому нам оно не важно

Artur
14.06.2018
15:01:19
https://www.scala-lang.org/api/2.12.x/scala/Unit.html

Страница 652 из 669