
Дмитрий
21.05.2017
20:51:15
Ну насчёт нет нужды это вряд ли. Можно обойтись — да

Александр
21.05.2017
21:07:52
Там выше речь была о том чтобы дать возможность динамически назначать типы
собственно, зачем тогда статическая типизация?
в целом, да, я хотел сказать именно "можно обойтись", потому как интерфейсами из внешних библиотек пользуемся повсеместно

Google

Aleh
21.05.2017
21:20:06


Friedrich
22.05.2017
05:31:48
Нет нужды использовать интерфейсы из чужих библиотек, наш код же не использует все их возможности, а только часть, для которой мы можем описать интерфейс самостоятельно
для примера:
const createPerson = () => ({ firstName: 'John', lastName: 'Doe' })
мы можем написать код:
interface IPerson {
firstName: string;
}
function showPerson(person: IPerson):void {
console.log(person.firstName);
}
showPerson(createPerson());
и всё будет работать как надо
Ну, это не такая уж и плохая идея. Я, наверное, перепишу этот код как ты предлагаешь, спасибо. Но в общем случае с утверждением не согласен. Наш код, например, использует все возможности этого внешнего интерфейса (все три, ага) :)

Александр
22.05.2017
05:59:20
Ну динамически получать тип и потом его использовать, это не совсем путь статической типизации. (тем более получать из кода который пишешь не ты сам)

andretshurotshka?❄️кде
22.05.2017
06:01:14
Почему динамически-то тип функции же известен
и записан статически

Александр
22.05.2017
06:21:59
ну раз его нельзя использовать, значит он не экпортируется из той внешней библиотеки
как можно завязывать свой код на что-то приватное внутри другой библиотеки?

Friedrich
22.05.2017
06:29:05
Я не уверен, что правильно называть это "приватным".
Этот тип используется в публичной функции. Методы этого типа мне известны снаружи и статически резолвятся. Если из этого типа что-то будут убирать, или в нём что-то будут менять — это будет ломающим изменением точно так же, как в любом публичном типе.
Единственная проблема: я не могу назвать имя этого типа, он анонимный.
Твоя идея с введением собственного интерфейса мне нравится значительно больше, чем имеющееся решение (которое я там сейчас в коде скотчем примотал). Но этот интерфейс будет копипастой из кода библиотеки. Копипаста — нехорошо.

Александр
22.05.2017
06:41:53
Это не совсем копипаста, это интерфейс данных для кода который мы пишем, там всё и не нужно.
Может быть внешнюю библиотеку потом придётся сменить и под этот интерфейс можно написать адаптер и присоединить что угодно.

Max
22.05.2017
07:37:10
парни
так что нашли нормального из tslint?

Google

Friedrich
22.05.2017
07:51:08
Это не совсем копипаста, это интерфейс данных для кода который мы пишем, там всё и не нужно.
Может быть внешнюю библиотеку потом придётся сменить и под этот интерфейс можно написать адаптер и присоединить что угодно.
Не согласен с первым утверждением. Представим, что у библиотеки есть два метода:
producer: () => ITerminal
consumer: (ITerminal) => string
Если я хочу получить объект из producer, сохранить его в локальной переменной, а потом передать в consumer — значит, мне нужен точный тип этого объекта, или полная копипаста интерфейса из кода библиотеки (спасибо структурной типизации, что это вообще работает). И я считаю, что копипастить в данном случае... странно.
Я не хочу в данном случае менять внешнюю библиотеку или писать абстрактный адаптер (это нормальная задача, но она не имеет отношения к коду в данном случае). А то эдак получается, что нам вообще тайпинги от библиотек не нужны.


Александр
22.05.2017
08:07:38
конкретно про ITerminal, я посмотрел там уже экспортиться этот интерфейс и проблема как бы решена,
даже если бы автор действительно забил на это на всё всегда есть возможность форкнуть репу и использовать этот модуль по форку (где уже можно наэкспортить что угодно)
то есть это не проблема Typescript в целом, это сложности opensource

Олег
22.05.2017
08:16:06
на самом деле не экспортируется в main

Friedrich
22.05.2017
08:19:05
Я поправил только чтоб index.d.ts экспортировался. Но из него не экспортируется интересующий нас тип :(
Это потому, что я не знаю, как правильно сделать. Кто-нибудь посоветует?

Олег
22.05.2017
08:24:10
Скопировать нужный интерфейс в свой проект с другим названием?
Если у них изменится интерфейс и не сможет скаститься в твой то тебе должна вылететь ошибка при присвоение

Friedrich
22.05.2017
08:48:28
Я считаю, что нужно просто тайпинг сделать нормальный, чтоб он экспортировал тип ITerminal.

Олег
22.05.2017
08:50:11
Да, должен. Но если его нет...

Friedrich
22.05.2017
08:53:11
Тогда отправляешь пул-реквест и он появляется :)

Олег
22.05.2017
08:55:26
и делаешь то что надо делать, пока они обрабатывают твой PR

Friedrich
22.05.2017
09:13:46
Это-то понятно. Я локальное решение уже бахнул. Мне хочется по-нормальному теперь решить проблему :)

Max
22.05.2017
10:55:46
class DocumentList extends React.Component<Props, State> {
render(): React.ReactElement<any> {
return (
<DocumentListContainer/>
);
}
}
парни, а что тут вместо any писать?
пропсы DocumentList?

Сергей
22.05.2017
10:56:38

Max
22.05.2017
10:57:00
ну тогда tsline typedef кидает )

Aleh
22.05.2017
10:57:24
чет я тож не понимаю, зачем писать у render тип результата
тип результата в interface/type пишу и вроде больше нигде)

Google

Max
22.05.2017
10:57:58
нууу ок
typedef вырублю

Дмитрий
22.05.2017
11:33:39
Моя практика показала, что нужно типы как аргументов, так и результата, указывать по минимуму вообще

Max
22.05.2017
11:33:56
?

andretshurotshka?❄️кде
22.05.2017
11:34:47
по минимуму это на жс писать?)

Aleh
22.05.2017
11:44:23
ну аргументов ts не позволяет не указывать)

Max
22.05.2017
11:45:21
export type Rule = any;
тут достаточно сложная структура, которую я не уверен что смогу описать
что можно вместо any написать чтобы оно хотя бы по названию типа проверяла?

Aleh
22.05.2017
11:47:06
не совсем понятно, что хочешь, чтобы проверялось

Max
22.05.2017
11:47:38
ну хотя бы чтобы на выходе был тип Rule

Дмитрий
22.05.2017
11:48:46

Max
22.05.2017
11:49:13
хотя
кто-нибудь видел тайпинги для структуры запроса к монге?
понятно
тут тоже не осилили
https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/mongodb/index.d.ts#L433

Дмитрий
22.05.2017
11:58:28

Дмитрий
22.05.2017
11:58:50
То есть почти везде

Дмитрий
22.05.2017
11:59:06
Я же не говорю "вообще не указывать типы". Я говорю "указывать в минимально необходимом количестве"

Google

Дмитрий
22.05.2017
11:59:33
Ну вот функции рендера точно не нужно указывать, например)
Или, в том же реакте, указать функциональному компоненту тип StatelessComponent и уже не нужно напрямую указывать, что он принимает и что возвращает

Artur
22.05.2017
12:04:51

Дмитрий
22.05.2017
12:05:42

Aleh
22.05.2017
12:05:55
из return же

Дмитрий
22.05.2017
12:06:04
Что там, где выводятся типы, их указывать не надо

Admin
ERROR: S client not available

andretshurotshka?❄️кде
22.05.2017
12:07:51

Max
22.05.2017
12:08:34
да это структура данных
генерик зачем? )

andretshurotshka?❄️кде
22.05.2017
12:09:19
ну чтобы на выходе тот же тип был
<T>(v: T) => T
Хотя не очень понял что надо)

Nikita
23.05.2017
13:06:38
кто подскажет как быстро определить модуль, как any?

Сергей
23.05.2017
13:07:08

Aleh
23.05.2017
13:08:02
declare module "asd";

Nikita
23.05.2017
13:08:04
const moduleName: any
[ts] Could not find a declaration file for module 'peer'. 'c:/projects/meetover/node_modules/peer/lib/index.js' implicitly has an 'any' type.

Сергей
23.05.2017
13:08:24
посмотри в DefinitelyTyped
любое определение

Nikita
23.05.2017
13:08:40

Google

Сергей
23.05.2017
13:08:43
declare module 'moduleName' {
}
но any нельзя вызвать

Aleh
23.05.2017
13:08:57
d.ts

Nikita
23.05.2017
13:09:00

Сергей
23.05.2017
13:09:08

Aleh
23.05.2017
13:09:20

Nikita
23.05.2017
13:09:48
ошибок там под миллион, версия сильно расходится с текущей

Олег
23.05.2017
13:10:38

Nikita
23.05.2017
13:18:46

Aleh
23.05.2017
13:19:10
как угодно, у меня src/declarations.d.ts для такого лежит
там буквально 100 строк такой всякой ерунды

Nikita
23.05.2017
13:19:49

Сергей
23.05.2017
13:20:02

Aleh
23.05.2017
13:20:38
разницы нет

Сергей
23.05.2017
13:21:01
Да, но вроде как порядка больше;

Aleh
23.05.2017
13:21:20
хз, какой там порядок нужен в 100 строках)

Олег
23.05.2017
13:22:26
можно и по разным, только в отдельном файле референсы прописать