
Ivan
18.06.2016
12:27:04
собсна что хотим от рекомпоза - имея типы
Чтобы тип Comp3 определялся - в таком раскладе он определяет тип
но приходится явно описывать типы всех HOC
(props: { input: string }) - это как бы задалбывает

Google

Ivan
18.06.2016
12:29:07
или самому заранее прописывать тип компоненты на входе чтобы получить атоматическое разруливание типов внутри хоков?
Я так понимаю и то и то сразу не выйдет

Roman
18.06.2016
12:31:06

Ivan
18.06.2016
12:33:07
правда я даже доков по ts не читал поэтому могу ошибаца ?

Vasiliy
18.06.2016
12:34:51
мне надо переварить это, спасибо)

Ivan
18.06.2016
13:05:27


andretshurotshka?❄️кде
18.06.2016
13:07:02
interface IUpdate {
update_id: number;
}
interface UpdateMessage extends IUpdate {
message: any;
}
interface UpdateInlineQuery extends IUpdate {
inline_query: any;
}
interface UpdateCallbackQuery extends IUpdate {
callback_query: any;
}
type Update = UpdateMessage | UpdateInlineQuery | UpdateCallbackQuery;
function isMessage (x: Update): x is UpdateMessage {
return !!(<UpdateMessage> x).message;
}
function isInlineQuery (x: Update): x is UpdateInlineQuery {
return !!(<UpdateInlineQuery> x).inline_query;
}
function isCallbackQuery (x: Update): x is UpdateInlineQuery {
return !!(<UpdateCallbackQuery> x).callback_query;
}
function checkType(u: Update) {
switch (true) {
case isMessage(u):
console.log('message', u);
break;
case isInlineQuery(u):
console.log('inline query', u);
break;
case isCallbackQuery(u):
console.log('callback query', u)
break;
default:
console.log('unknown type', u)
}
}
checkType({
update_id: 323421,
message: {},
inline_query: undefined,
callback_query: undefined
})
checkType({
update_id: 323421,
message: undefined,
inline_query: {},
callback_query: undefined
})
checkType({
update_id: 323421,
message: undefined,
inline_query: undefined,
callback_query: {}
})
можно такое по-другому написать?


Vasiliy
18.06.2016
13:18:56
вот так работает:
import { StatelessComponent } from 'react';
export default <StatelessComponent<ICounterProps>>composed;
или тоже самое, только короче:
import { SFC } from 'react';
export default <SFC<ICounterProps>>composed;
мне пока проще всего на этом остановиться тк надо херачить по-резкому дальше (: но я вернусь к этому 100% чуть позже на неделе

? Snyp
18.06.2016
13:32:58
Посоветуйте тех. вуз на заочку, в спб с it тематикой.

Vasiliy
18.06.2016
13:45:48
у меня ts-loader + webpack и я хочу вынести пару интерфейсов отдельный файл чтобы их пошарить, я правильно ведь понял что это надо делать в .d.ts? как вы делаете если надо совместно использовать интерфейсы в 2-х разных файлах?
хм, просто создал файлик types.d.ts, закинул туда нужные интерфейсы и рефернс не писал даже в рядом лежащих .ts-файлах, а интерфейсы видны и все ок, не понял как это работает и не уверен, что все правильно делаю, но работает

Aleh
18.06.2016
14:23:05
У меня например есть интерфейс UserRepository и у него две имплементации и куева туча использований

Google

Aleh
18.06.2016
14:24:31
Только нельзя писать export default interface, приходится в две строки или без default :)

Alexander
18.06.2016
14:30:27

Ҫѐҏӗѫӑ
18.06.2016
14:31:17
вообще с импортами и экспортами дефинишнов нк все хорошо, стоит признать

Aleh
18.06.2016
14:40:31
Так я не про дефинишины

Sergey
18.06.2016
14:48:39

Vasiliy
18.06.2016
14:52:40
там вроде нет особо доков, есть тесты и API.md, но она простая, вот еще примеры какие-то нашел старые https://github.com/stoeffel/recompose-examples

Viacheslav
18.06.2016
17:50:23
если интересно, могу показать когда буду дома

Ivan
18.06.2016
17:51:00
очень

Viacheslav
18.06.2016
17:51:41
если забуду, пингвин через час
пингани*

Ҫѐҏӗѫӑ
18.06.2016
17:51:59
Пингвин

Ivan
18.06.2016
17:52:03
ок спасибо пингвану
но теперь зная что это возможно лучше пока не показывай - денек подумаю

Viacheslav
18.06.2016
17:56:45
почти всегда, не удалось разобраться до конца

Ҫѐҏӗѫӑ
18.06.2016
18:10:08
?

Alexander
18.06.2016
18:35:49

Vasiliy
18.06.2016
18:37:24
не понимаю какой смысл ставить бабель после ts-loader, если все равно ts не соберет то, что не сможет
например, вещи из stage-0

Google

Vasiliy
18.06.2016
18:37:52
({ foo, bar, …rest }) =>, Object.values, etc, как без этого жить? Object.assign писать везде?

Alexander
18.06.2016
18:37:55
Прокси не соберет)))

Aleh
18.06.2016
18:38:31
Object.assign?
А, не то)

Vasiliy
18.06.2016
18:40:55
очень не удобно без object spread, например
я привык в компонентах писать ({ foo, bar, qux, …rest }) => (my jsx), а сейчас такое до бабеля даже не дойдет
наверное, было бы круто, если бы можно было просто сказать типа “тут я знаю, что не корректный синтаксис, пропусти”, тогда дошло бы до бабеля и он бы транспильнул. как eslint-disable(-line), например. хотя не уверен, что это хорошая идея

Aleh
18.06.2016
19:57:59
ну, это не так просто. Парсеру придется угадывать тогда, какой кусок невалиден и надо игнорить, а какой валиден
если писать в комментах какие-то штуки, вроде /** @ts-parser skip **/, то сам смысл ts теряется
да и проще этот сахарок тогда развернуть)
тут мне кажется, было бы круто, если бы сам ts можно было также или в меньшей степени расширять плагинами аля babel
а если еще api к парсеру запилить такой же, отделив от части type-detect, вообще хорошо бы вышло
стоп, это же flow

Viacheslav
18.06.2016
20:25:59
я ставлю babel после ts для react оптимизаций
надо, кстати, проверить насколько они помогают

Dmitry
18.06.2016
20:32:23
То есть ты не проверял и просто так их зафигачил? :3

Viacheslav
18.06.2016
20:33:31
изначально я включил бабель для hmre
потом объявили о rhl3.0

Google

Viacheslav
18.06.2016
20:33:58
hmre я выпилил, а плагины оптимизации осталить
и да, я так и не сравнивал

Vasiliy
18.06.2016
23:47:39
но я так и не понимаю как жить без object spread, ведь нет ...rest, а мне очень часто бывает нужно все не известные свойста передать вложенному элементу, т.е. без всяких omit и т.д (не уверен, что понятно то, что я написал). как вы это сейчас делаете?

Andrey
19.06.2016
07:19:06


Ivan
19.06.2016
09:18:07
@vslinko по поводу композа - давай посмотрим твою версию. потому что никакая моя версия не пашет в паре с Object.assign а это самый распространненный вариант return в recompose, вот пример словами BAD помечено где плохо
// Simple flow
interface HOC<TIn, TOut> {
(p: TIn): TOut;
}
function flow<TIn, TOut, T0>(p0:HOC<TIn, T0>, p1:HOC<T0, TOut>): HOC<TIn, TOut> {
return (v: TIn) => {
const r: TOut = p1(p0(v));
return r;
}
}
// This works as expected
const a = flow( // 'a' has type
(e: number) => ({ // type of 'e' should be set
a: 10
}),
(p) => ({ // 'p' has type
b: 10,
prev: p
})
);
ЗЫ: разрулил трабла была в Object.assign({})
// ---- BUT THIS WILL NOT WORK
const b = flow( // BAD: 'b' has type HOC<number, any>
(e: number) => Object.assign({ // 'e' type should be set
a: 10
}),
(p) => Object.assign( // BAD: 'p' has type `any
{ b: 10 },
p
)
);
FUCK
разрулил Object.assign({x:1}) возвращает any
если поменять на Object.assign({}, {x: 1}) работает


Aleh
19.06.2016
10:04:37
@vslinko по поводу композа - давай посмотрим твою версию. потому что никакая моя версия не пашет в паре с Object.assign а это самый распространненный вариант return в recompose, вот пример словами BAD помечено где плохо
// Simple flow
interface HOC<TIn, TOut> {
(p: TIn): TOut;
}
function flow<TIn, TOut, T0>(p0:HOC<TIn, T0>, p1:HOC<T0, TOut>): HOC<TIn, TOut> {
return (v: TIn) => {
const r: TOut = p1(p0(v));
return r;
}
}
// This works as expected
const a = flow( // 'a' has type
(e: number) => ({ // type of 'e' should be set
a: 10
}),
(p) => ({ // 'p' has type
b: 10,
prev: p
})
);
ЗЫ: разрулил трабла была в Object.assign({})
// ---- BUT THIS WILL NOT WORK
const b = flow( // BAD: 'b' has type HOC<number, any>
(e: number) => Object.assign({ // 'e' type should be set
a: 10
}),
(p) => Object.assign( // BAD: 'p' has type `any
{ b: 10 },
p
)
);
https://gist.github.com/9fab68809eda6d1aaa52f25d93f83b72 наивная версия)
кстати, вот интересный issue по теме https://github.com/Microsoft/TypeScript/issues/5453
запили ишью
https://github.com/Microsoft/TypeScript/issues/3792 таки нет
надо пилить PR :)


Vasiliy
19.06.2016
11:19:30

Aleh
19.06.2016
11:20:09
этот же самый tsserver же юзается во всяких vscode, atom, sublime. Там все тоже так?
я пока возвращаюсь на tsc+neomake, оно так не лагает

Vasiliy
19.06.2016
11:20:57
да, интересно узнать насколько хорошо это на других редакторах работает ^

Viacheslav
19.06.2016
11:48:43
я юзаю вот такую версию https://gist.github.com/vslinko/8adfcb8ccfb7f68b081ce400956f58d2
@cybice ^

Ivan
19.06.2016
11:50:43
Спасибо Слав!

Google

Viacheslav
19.06.2016
11:59:01
как виндно, некоторые вещи все равно приходится объявлять, но не все


Vasiliy
19.06.2016
15:52:39
ребят, а может кто-нибудь на примере показать как расширять типы?
конкретный пример: require.context
вроде многие должны использовать у кого вебпак
1) ставлю тайпинги typings install dt~require —save —global
2) у меня есть файл vendors.d.ts, в нем хочу добавить ф-цию context
context: (path: string, deep?: boolean, filter?: RegExp) => RequireContext;
как это сделать?
т.е. все чего я хочу на самом деле это require.context
но
ERROR in ./src/app/components/ui/my-awesome-component-that-calls-require-dot-context/index.ts
(7,23): error TS2339: Property 'context' does not exist on type 'Require'.
такие вот штуки это пока что самая большая моя боль, они сильно меня тормозят
хотя вот что-то нашел
https://github.com/DefinitelyTyped/DefinitelyTyped/issues/6170
не, не понимаю( поставил тайпинги для webpack, webpack-env и require, но
так не работает, они конфликтуют как-то, а убрать require typings я не могу, тк тогда другая ошибка будет:
ERROR in /Users/vyorkin/projects/work/my-awesome-project-here/typings/globals/require/index.d.ts
(367,13): error TS2403: Subsequent variable declarations must have the same type. Variable 'require' must be of type 'RequireFunction', but here has type 'Require'.
ERROR in ./src/app/index.tsx
(23,52): error TS2339: Property 'default' does not exist on type '{}'.
ок, надо было просто выкинуть все, кроме webpack-env, ну вот – минус полчаса (:


Gordey
19.06.2016
16:37:59
пиши исчо ??