Why Typescript is bad
1.8K subscribers
72 photos
70 links
All topics related to TS

chat: @why_typescript_is_bad_chat
contact: @stuneak
Download Telegram
Forwarded from Sergey Sova
наброс на кривость тс
Forwarded from Sergey Sova
это компилится без ошибки
Forwarded from Sergey Sova
но порождает кривой код
Forwarded from Sergey Sova
когда ты явно указываешь значения элементов энама
их порядок должен быть любым
но здесь порядок влияет на результат
Forwarded from Sergey Sova
b: any

по твоему это вывод типов?
Forwarded from Sergey Sova
для сравнения
b: number
Forwarded from Богдан
Мне кажется этот пример еще лучше показывает самую большую на мой вгзляд проблему тайпскрипта - неумение (в отличие от флоу) проверять параметры у метода объекта
function getUserGreetings(user: { sayHello(user: { firstName: string }): string }) {
user.sayHello({firstName: "vasya"})
}

getUserGreetings({
sayHello(user: { firstName: string, lastName: string }): string {
return "hello" + user.firstName.toUpperCase() + " " + user.lastName.toUpperCase();
}
})
Есть функция getUserGreetings которая принимает объект с методом seyHello и вызывает его передав объект с одним полем firstName. Дальше эта функция getUserGreetings вызывается с передачей объекта у которого метод sayHello принимает объект не с одним а с двумя полями firstName и lastNamе и мы получаем ошибку в рантайме а тайпскрипт со всеми флагами строгости тупо не видит ошибку
Forwarded from Sergey Sova
на самом деле тут ошибка в том, что ты переопределил тип при вызове функции getUserGreetings

а ошибка тс в том, что он не проверил совместимость типов
Forwarded from Sergey Sova
вот так всё ловит
Forwarded from Sergey Sova
а флоу первоначальный вариант сразу же отлавливает и всё ок
Forwarded from Anton
я на самом деле тут сам с дженериков плевался, раз пошла такая пьянка

допустим у нас есть функция которая принимает класс и возвращает инстанс этого класса
const foo = <S>(arg: S) => S

Эти типы неправильные, потому что когда мы вызовем эту функцию скажем foo(MyClass) => new MyClass() тайпскрипт ее запишет как <S>(arg: S) => typeof S

при этом написать скажем const foo = <S>(arg: S) => InstanceOf<S> по какой то причине не сработает. решением тут будет написать const foo = <S>(arg: { new: (props) => S}) => S

что в приинципе довольно логично, но чудовищно неочевидно, не покрыто тайпскриптовскими доками примерно никак и непонятно почему инстансоф не работает
Forwarded from кана
interface A { a(): string };
interface B { b(): string };

function f(x: A | B): string {
if ("a" in x) {
return x.a();
} else {
return x.b();
}
}

const x = { a: 10, b() { return "hello"; } };
const y: B = x;
f(y);


то есть вот пример, когда тс говорит все ок, а все не ок
Forwarded from tоrіnіngеn
вот хороший с т.з. эвристик тс код, который падает в рантайме
Forwarded from Pavel Shakhov (pongo)
но если вместо геттера использовать метод, то тс начинает ругаться "возможно null".

т.е. это какой-то баг в тс с геттерами?
Forwarded from Alexey Kuzmichev
тут тайпскрипт полагает, что если мы попали внутрь if(x.a) то x.a не может быть null
Forwarded from Alexey Kuzmichev
так что наверное это можно считать багом с геттерами, потому что x.a мутируется в тот момент, когда ты получаешь от него значение