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
для сравнения
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 мутируется в тот момент, когда ты получаешь от него значение
Forwarded from tоrіnіngеn
ну вообще по правде тс не знает о существовании геттеров
Forwarded from tоrіnіngеn
для тс аттрибут и геттер синонимичны