Aleh
05.06.2018
21:15:25
Ну т.е. да, as это повод задуматься
Winterhold
06.06.2018
00:15:12
Всем привет
Максим
06.06.2018
04:35:18
Всем привет! Кто-то сталкивался с таким поведением?http://www.typescriptlang.org/play/index.html#src=function%20onError(error%3A%20Error)%3A%20never%20%7B%0D%0A%09throw%20error%3B%0D%0A%7D%0D%0A%0D%0Aconst%20numbers%3A%20number%5B%5D%20%3D%20%5B1%2C%202%2C%203%5D%3B%0D%0A%0D%0Afunction%20getAllowedNumberOrThrow1(n%3A%20number)%3A%20number%20%7C%20never%20%7B%0D%0A%09const%20nFromArray%20%3D%20numbers.find(num%20%3D%3E%20num%20%3D%3D%3D%20n)%3B%0D%0A%0D%0A%09if%20(nFromArray%20%3D%3D%3D%20undefined)%20%7B%0D%0A%09%09onError(new%20Error(%60There%20is%20no%20%24%7Bn%7D%20in%20%5B%24%7Bnumbers.join(%22%2C%20%22)%7D%5D%60))%3B%0D%0A%09%7D%0D%0A%0D%0A%09%2F*%0D%0A%09Type%C2%A0'number%C2%A0%7C%C2%A0undefined'%C2%A0is%C2%A0not%C2%A0assignable%C2%A0to%C2%A0type%C2%A0'number'.%0D%0A%09Type%C2%A0'undefined'%C2%A0is%C2%A0not%C2%A0assignable%C2%A0to%C2%A0type%C2%A0'number'.%0D%0A%09*%2F%0D%0A%09return%20nFromArray%3B%0D%0A%7D%0D%0A%0D%0A%0D%0Afunction%20getAllowedNumberOrThrow2(n%3A%20number)%3A%20number%20%7C%20never%20%7B%0D%0A%09const%20nFromArray%20%3D%20numbers.find(num%20%3D%3E%20num%20%3D%3D%3D%20n)%3B%0D%0A%0D%0A%09if%20(nFromArray%20%3D%3D%3D%20undefined)%20%7B%0D%0A%09%09throw%20new%20Error(%60There%20is%20no%20%24%7Bn%7D%20in%20%5B%24%7Bnumbers.join(%22%2C%20%22)%7D%5D%60)%3B%0D%0A%09%7D%0D%0A%0D%0A%09%2F%2F%20OK%0D%0A%09return%20nFromArray%3B%0D%0A%7D
Pawel
06.06.2018
05:20:37
с каким поведением?
Google
Alex
06.06.2018
06:06:54
С таким поведением http://www.typescriptlang.org/play/index.html#src=function%20onError(error%3A%20Error)%3A%20never%20%7B%0D%0A%09throw%20error%3B%0D%0A%7D%0D%0A%0D%0Aconst%20numbers%3A%20number%5B%5D%20%3D%20%5B1%2C%202%2C%203%5D%3B%0D%0A%0D%0Afunction%20getAllowedNumberOrThrow1(n%3A%20number)%3A%20number%20%7C%20never%20%7B%0D%0A%09const%20nFromArray%20%3D%20numbers.find(num%20%3D%3E%20num%20%3D%3D%3D%20n)%3B%0D%0A%0D%0A%09if%20(nFromArray%20%3D%3D%3D%20undefined)%20%7B%0D%0A%09%09onError(new%20Error(%60There%20is%20no%20%24%7Bn%7D%20in%20%5B%24%7Bnumbers.join(%22%2C%20%22)%7D%5D%60))%3B%0D%0A%09%7D%0D%0A%0D%0A%09%2F*%0D%0A%09Type%C2%A0'number%C2%A0%7C%C2%A0undefined'%C2%A0is%C2%A0not%C2%A0assignable%C2%A0to%C2%A0type%C2%A0'number'.%0D%0A%09Type%C2%A0'undefined'%C2%A0is%C2%A0not%C2%A0assignable%C2%A0to%C2%A0type%C2%A0'number'.%0D%0A%09*%2F%0D%0A%09return%20nFromArray%3B%0D%0A%7D%0D%0A%0D%0A%0D%0Afunction%20getAllowedNumberOrThrow2(n%3A%20number)%3A%20number%20%7C%20never%20%7B%0D%0A%09const%20nFromArray%20%3D%20numbers.find(num%20%3D%3E%20num%20%3D%3D%3D%20n)%3B%0D%0A%0D%0A%09if%20(nFromArray%20%3D%3D%3D%20undefined)%20%7B%0D%0A%09%09throw%20new%20Error(%60There%20is%20no%20%24%7Bn%7D%20in%20%5B%24%7Bnumbers.join(%22%2C%20%22)%7D%5D%60)%3B%0D%0A%09%7D%0D%0A%0D%0A%09%2F%2F%20OK%0D%0A%09return%20nFromArray%3B%0D%0A%7D
Максим
06.06.2018
06:52:28
если throw ошибки вынести в отдельную функцию onError, то компилятор не понимает, что поток выполнения прерывается на месте вызова этой функции onError
если throw ошибки вынести в отдельную функцию onError, то компилятор не понимает, что поток выполнения прерывается на месте вызова этой функции onError
в strict: true моде
если убираю флаг strict то норм(
Morsik
06.06.2018
10:29:19
Максим
06.06.2018
10:30:15
в playground в первой строчке есть эта сигнатура
Morsik
06.06.2018
10:30:41
А, не посмотрел
Artur
06.06.2018
10:36:32
Максим
06.06.2018
10:37:35
ага - return помогло
спасибо
Pawel
06.06.2018
12:08:13
есть такой вот класс
export class Game {
id: number;
home: string;
away: string;
score_home: number;
score_away: number;
// ещё до хера полей
}
есть класс, описывающий как изменилась игра
export class GameChanges {
id: number;
order: number | null;
score_home: number | null;
score_away: number | null;
in_play: boolean | null;
time: string | null;
// и т.д. - ещё до хера полей
}
у класса Game есть метод, которая применяет изменения
applyGameChanges (a:GameChanges) {
this.order = a.order ? a.order : this.order;
this.score_home = a.score_home ? a.score_home : this.score_home;
this.score_away = a.score_away ? a.score_away : this.score_away;
this.in_play = a.in_play ? a.in_play : this.in_play;
// и т.д.
};
Вопрос такой - как нормально переписать applyGameChanges в обощённом виде, чтобы какой то цикл по всем полям обеих классов?
Kirill
06.06.2018
12:08:28
А type guards только с if работает? Тернарки не понимает?
Google
Дмитрий
06.06.2018
12:08:41
Pawel
06.06.2018
12:11:45
Не на том экономишь
1. взять что-то типа списка строк
2. цикл по полям Game и полям GameChanges
3. если if (GameChanges[filed]) то установить Game[filed] = GameChanges[filed]
как это сделать в ts
Дмитрий
06.06.2018
12:12:12
4. Страдать от использования объектов не по назначению
Pawel
06.06.2018
12:12:37
шта?
Дмитрий
06.06.2018
12:13:41
Если тебе нужно итерироваться по ключам и значениям, ты используешь объекты и классы вместо Map, не по назначению
После чего, естественно, огребешь, но жалеть будет уже поздно
Pawel
06.06.2018
12:21:30
Дмитрий
06.06.2018
12:22:08
Нет, предлагаю задуматься почему у тебя код разросся так что даже перечислить его затруднительно
Pawel
06.06.2018
12:24:09
Дмитрий
06.06.2018
12:25:13
Типизировать хорошо общение с бэком — идеальный вариант
но часто невозможен
Pawel
06.06.2018
12:28:22
Дмитрий
06.06.2018
12:28:41
Ну норм
Vadim
06.06.2018
12:41:41
Всем привет. А вакансии можно сюда скидывать?
Alexander
06.06.2018
12:41:53
Нет
Vadim
06.06.2018
12:42:12
А есть какой-то канал для TS вакансий?
Alexander
06.06.2018
12:42:16
Есть @js_jobs вроде
Даже @javascript_jobs :)
⭐️Alexandra
06.06.2018
12:42:40
Vadim
06.06.2018
12:49:12
Спасибо большое
Google
Pawel
06.06.2018
13:15:32
В правилах группы такого не сказано что сюда нельзя кидать вакансии. Юзер @akrasnov96 - не админ. Поэтому предлагаю юзеру @vsmakhtin не обращать внимание на вахтёров.
Alexander
06.06.2018
13:18:13
Давай админа спросим @mkusher
Vadim
06.06.2018
13:18:22
Ок, у нас просто есть классная вакансия именно для TypeScript разработчика, я CTO, поэтому можно вопросы писать мне напрямую.
Тогда ждем что скажет @mkusher
Aleh
06.06.2018
13:19:10
нет, вакансии в @js_jobs
Vadim
06.06.2018
13:19:49
Понял, спасибо, там уже опубликовал
Dmitrii
06.06.2018
13:22:05
@mkusher а babel-plugin-typescript умеет удалять ненужные импорты (типа интерфейсов) или оставляет? по идее он же не знает ничего про семантику
Aleh
06.06.2018
13:23:03
Вот с const enum не получится уже, там надо знать значения
Максим
06.06.2018
13:26:58
Vadim
06.06.2018
13:30:01
Dmitrii
06.06.2018
13:34:13
Антон
06.06.2018
19:18:21
Можно ли сделать такой декоратор для класса, чтобы при вызове любого метода класса производились заданные действия?
Artur
06.06.2018
20:01:28
Можно ли сделать такой декоратор для класса, чтобы при вызове любого метода класса производились заданные действия?
можно
function decorator(Class: new (...args: any[]) => {}) {
const descriptor = Object.getOwnPropertyDescriptors(Class.prototype);
const keys = Object.keys(descriptor);
for (const key of keys) {
if (typeof descriptor[key].value === 'function') {
Object.defineProperty(Class.prototype, key, {
configurable: true,
value() {
console.log('called method ' + key);
return descriptor[key].value.apply(this, arguments);
},
});
}
}
}
@decorator
class Abc {
foo() {}
bar() {}
}
const abc = new Abc();
abc.foo(); // called method foo
abc.bar(); // called method bar
Антон
06.06.2018
21:17:05
Дмитрий
06.06.2018
22:31:27
★nton
07.06.2018
01:45:57
https://www.youtube.com/watch?v=M3BM9TB-8yA
https://github.com/ry/deno
Дмитрий
07.06.2018
01:49:36
★nton
07.06.2018
02:03:24
Кек
Google
NEOQAZAQUE
07.06.2018
06:41:53
Как-то тут поясняли что лучше в стрелочных функциях всегда ставить скобки для параметров
Andrey
07.06.2018
06:42:11
Есть такой фетиш.
NEOQAZAQUE
07.06.2018
06:42:11
Все таки лучше ставить?
Andrey
07.06.2018
06:42:19
Если хочется.
Я не ставлю. Сова ставит.
Abu
07.06.2018
06:48:08
Andrey
07.06.2018
06:48:20
Kendr
07.06.2018
06:56:48
Andrey
07.06.2018
06:57:08
А лучше поставь что-то типа преттиера и забей.
Gordey
07.06.2018
06:57:27
Еще лучше, используй 2 пробела вместо 4
(простите)
Kendr
07.06.2018
06:57:32
Andrey
07.06.2018
06:57:56
Пёс Цифрового Сопротивления
07.06.2018
07:11:32
И все это из дефолта cli идет
Max
07.06.2018
08:00:59
В vscode
Сергей
07.06.2018
08:13:13
Oleg
07.06.2018
08:14:16
там без скобочек он интерфейс не поймет
Google
Oleg
07.06.2018
08:15:04
будет ругаться на ( item : Item => {} )
Andrey
07.06.2018
08:16:51
Кстати да, в ts вообще нет смысла без скобок писать.
Какой вывод типов?
Да, это чат тс. Не ошибся.
А, понял. Ну да, соглашусь.
Nikolay
08.06.2018
05:45:41
Привет, всем,
Я тут нашел интересный кейс, когда в компиляторе не срабатывает проверка типа и пропускает экстра-свойства, если передавать ссылку на объект в функцию. Пример - https://pastebin.com/qQ2MVu9R
Как такое может быть? Можно ли исправить?
Artur
08.06.2018
06:03:05
Nikolay
08.06.2018
06:08:28
Это by design, потому что нету exact type
Вряд ли, для инлайновых объектов тип все-таки выводится. Тем не менее, мой пример не работает при использовании typescript@3.0.0-dev.20180607 - https://github.com/Microsoft/TypeScript/pull/19513
Artur
08.06.2018
06:09:07
Anton
08.06.2018
06:14:58
Вряд ли, для инлайновых объектов тип все-таки выводится. Тем не менее, мой пример не работает при использовании typescript@3.0.0-dev.20180607 - https://github.com/Microsoft/TypeScript/pull/19513
Это не баг, это структурная типизация. Если в объекте есть все свойства, которые нужны - он нам подходит. Когда ты создаёшь объект в месте передачи, структурная типизация не работает, потому что тут она не нужна. Если будешь создавать объект и явно задашь тип переменной, TS лишние свойства в неё положить не даст, но если ты создашь объект со свойствами foo и bar, а потом попытешься по ссылке передать его в переменную, тип которой ждёт только foo, то такое прокатит.
Artur
08.06.2018
06:23:40
Ну и вот как бы: https://github.com/Microsoft/TypeScript/issues/12936
Pawel
08.06.2018
06:52:28
Когда ты создаёшь объект в месте передачи, структурная типизация не работает, потому что тут она не нужна.
орнул. с чего это она тут не нужна?
Anton
08.06.2018
07:51:28