const isPosts = (posts: unknown): posts is Posts => !!posts
&& typeof posts === 'object'
const isPosts = (posts: unknown): posts is Posts => !!posts
&& typeof posts === 'object'
//&& ...
Posts
, а не "какой-то объект" и вообще не какая-то неведомая хрень.Posts
. onloadend
на классический onload
.картинка.src =
и картинка.onload =
- возможно событие отрабатывает прямо при присваивании, т.к. ничего грузить не надо(хотя и те должно бы). let num = 0;
не помешает тебе далее по коду сделать num = { foo: 'bar' }
или даже num = funcion() {}
.props.name
будет только то, что придёт с сервера - то можно забить и так и писать.{
'story': {
header: string;
page: {
tag: string;
image_src: string;
image_alt: string;
}[];
};
}
"story"
. Соответственно ты не можешь обращаться к нему никак иначе чем через blogPosts.story
(blogPosts["story"]
).props.name
должен лежать тип "story"
, а не string
.undefined
при этом уверенно думая, что у тебя там Post
.type Posts = {
[key: string]: Post
}
ты говоришь тайпскрипту "при обращении по любому строковому ключу мне гарантировано вернётся Post
". Т.е. ты снимаешь с тайпскрипта ответственность и берёшь её на себя. instanceof
и т.п. Вообще хоть какой-то способ получить аргументы конструктора класса User есть?
constructor
. Метод с точки зрения js - это просто функция. Имена аргументов функции ни на что снаружи не влияют, и просто являются по сути мапингом по порядку в переменные внутри функции. Имена аргументов функции никак не доступны - точно также, как недоступны поля класса. Единственное что доступно - поле length
функции содержащее количество аргументов(но и оно не учитывает, не может учитывать, ...spread
параметры или использование arguments
).Ctor.toString()
и спарсить их из полученной текстовой репрезентации. Только вид этой текстовой репрезентации ничем не гарантирован(хоть и на данный момент вроде идентичен средь браузеров) и применять такое в проде нельзя.:)AxiosResponse
поле data
имеет неизвестный тип. По умолчанию и для удобства - any
, но на самом деле хрен знает, что там с сервера пришло. Нет там никакого constrictor
точно, потому, что если и придёт там объект - это будет простой примитивный объект.В javascript нет механизма получения полей класса
type Constructor<T = object, Arg = any> = new (...args: Arg[]) => T;
abstract class Api {
public validateRequest<T>(validationModel: Constructor<T>, response : T) : boolean {
// ts не даст сюда попасть если response УЖЕ не соответствует validationModel :)
return true;
}
}
response
имеет тип validationModel
на входе, чего ты конечно никак не можешь знать.:)type Constructor<T = object, Arg = any> = new (...args: Arg[]) => T;
abstract class Api {
public validateRequest<T>(validationModel: Constructor<T>, response: unknown): response is T {
// тут всё сверяем руками или через typia
return true;
}
}
Допустим я в самом методе, который принимает unknown, будут проверять, что пришедшее в метод нечто является объектом и в его прототипе находится Entity, а в иных случаях буду обрабатывать ошибку, но мне всё ещё не ясно, как определить непосредственно список параметров конструктора, с которым и нужно сравнивать ответ пришедший со стороны сервера.
В целом задача решается через класс: создаёшь класс, в нём методы которые делают именно нужные тебе операции, а уж реализацию внутри самих методов можешь писать любой замороченности(хранить копии в разной структуре, кэширование и т.д.) - тебе её надо написать только один раз, а дальше будешь пользоваться простыми и очевидными методами класса, абстрагировавшись от внутренней сложности.