Forwarded from Богдан
Мне кажется этот пример еще лучше показывает самую большую на мой вгзляд проблему тайпскрипта - неумение (в отличие от флоу) проверять параметры у метода объекта
function getUserGreetings(user: { sayHello(user: { firstName: string }): string }) {Есть функция getUserGreetings которая принимает объект с методом seyHello и вызывает его передав объект с одним полем firstName. Дальше эта функция getUserGreetings вызывается с передачей объекта у которого метод sayHello принимает объект не с одним а с двумя полями firstName и lastNamе и мы получаем ошибку в рантайме а тайпскрипт со всеми флагами строгости тупо не видит ошибку
user.sayHello({firstName: "vasya"})
}
getUserGreetings({
sayHello(user: { firstName: string, lastName: string }): string {
return "hello" + user.firstName.toUpperCase() + " " + user.lastName.toUpperCase();
}
})
Forwarded from Sergey Sova
на самом деле тут ошибка в том, что ты переопределил тип при вызове функции getUserGreetings
а ошибка тс в том, что он не проверил совместимость типов
а ошибка тс в том, что он не проверил совместимость типов
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
что в приинципе довольно логично, но чудовищно неочевидно, не покрыто тайпскриптовскими доками примерно никак и непонятно почему инстансоф не работает
допустим у нас есть функция которая принимает класс и возвращает инстанс этого класса
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 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
ну вообще по правде тс не знает о существовании геттеров