vk-io
vk-io copied to clipboard
Поддержка Extended Response для методов
Как известно, с этими методами много проблем, из-за их двоякого ответа, но я недавно нашёл решение, которое позволит всё типизировать корректно.
const method = ts.createMethodSignature(
[ts.createTypeParameterDeclaration("Params", paramsType, undefined)],
[params],
hasExtendedResponse
? ts.createConditionalTypeNode(
// Тут можно было бы и по-красивее, но с длинными названиями методов
// в Typescript Compiler API - нет, просто нет
ts.createTypeReferenceNode('Params["extended"]', undefined),
Creator.union([
ts.createTypeReferenceNode("true", undefined),
ts.createTypeReferenceNode("1", undefined)
]),
ts.createTypeReferenceNode("Promise", [extendedResponseType]),
ts.createTypeReferenceNode("Promise", [responseType])
)
: ts.createTypeReferenceNode("Promise", [responseType]),
methodName,
undefined
);
Где
const params = ts.createParameter(
undefined,
undefined,
undefined,
"params",
hasParams
? undefined
// Если нет required в описании параметров или в принципе нет параметров
: ts.createToken(ts.SyntaxKind.QuestionToken),
ts.createTypeReferenceNode("Params", undefined),
undefined
);
И да, это именно issue, потому что я понятия не имею как работает ваш генератор, я писал свой(чисто экперементировал), и это вырезка оттуда.
Выглядит хорошо, но нужно будет переписать генератор. Так как он рассчитан на старую схему JSON.
Насколько я понимаю, это методы с параметром fields (?)
Очень бы хотелось увидеть динамическую типизацию ответов таких запросов.
Думаю, будет релевантно: https://github.com/drizzle-team/drizzle-orm#feature-showcase-postgresql SQL Query Builder с очень хорошей типизацией. Возможно, можно что-нибудь адаптировать оттуда.
Насколько я понимаю, это методы с параметром
fields(?) Очень бы хотелось увидеть динамическую типизацию ответов таких запросов.
Это в первую очередь про поддержку параметра extended: 1. Название методов одно - ответ кардинально разный