Вы должны сделать тип TSpace
зависимым от типа TProtocol
. Один из способов достижения этого был бы следующим:
function getObject<
TProtocol extends PROTOCOL,
TSpace extends keyof OBJECT[TProtocol]
>(query: string): OBJECT[TProtocol][TSpace]
Во-первых, необходимо определить макрос, прежде чем это назовут.
Во-вторых, не имеет значения, где макрос вызывается, пока Вы загрузили его заранее.
Уточнить Вашу проблему: библиотека автоматического вызова является Вашим другом. Если Вы, администратор SAS не позволит Вам помещать свои макросы в библиотеку автоматического вызова, можно добавить автоматический вызов как так:
filename mymacros 'c:\mysas';
/*this defines the directory you have stored your macros*/
options sasautos=(sasautos mymacros) mautosource;
макрос должен быть определен, прежде чем это назовут. по причинам производительности лучше не определить макрос в другом - если Вы сделаете так, то затем это будет переопределено каждый раз, когда Вы называете внешний макрос. следующее хорошо работает:
%macro a;
%put a;
%b
%mend a;
%macro b;
%put b;
%c
%mend b;
%macro c;
%put c;
%mend c;
%*-- %a is main --*;
%a
/* on log
a
b
c
*/
Необходимо определить макрос, прежде чем это назовут, таким образом, строка с "%A" должна была бы следовать определению макроса A. Порядок других макроопределений не имеет значения, пока они определяются, прежде чем их назовут. Обычно в моих программах я настроил основной макрос как Вы, описывают, затем последняя строка программы называет этот макрос.
Другая опция рассмотреть состоит в том, чтобы создать макро-библиотеку автоматического вызова, которая содержит определения многих макросы. Это работает лучше всего на допускающие повторное использование макросы, так, чтобы Вы не переопределяли их в каждой программе.