Typescript 如何向筛选器动态添加新属性?
我有一个观察者,正在尝试向所有控制器动态添加一个名为“pivot”的新属性到param筛选器中,这可能吗Typescript 如何向筛选器动态添加新属性?,typescript,loopbackjs,loopback4,Typescript,Loopbackjs,Loopback4,我有一个观察者,正在尝试向所有控制器动态添加一个名为“pivot”的新属性到param筛选器中,这可能吗 @lifeCycleObserver('controller-overrider') export class PivotModelsObserver implements LifeCycleObserver { constructor( @inject.tag(RepositoryTags.REPOSITORY) public repositories: CrudRep
@lifeCycleObserver('controller-overrider')
export class PivotModelsObserver implements LifeCycleObserver {
constructor(
@inject.tag(RepositoryTags.REPOSITORY)
public repositories: CrudRepository[],
@inject.tag(CoreTags.CONTROLLER)
public controllers: ControllerClass[],
@inject(CoreBindings.APPLICATION_INSTANCE)
public app: CoreApplication,
) {}
/**
* This method will be invoked when the application starts
*/
async start(): Promise<void> {
for (const controller of this.controllers) {
const methods = MetadataInspector.getAllMethodMetadata<RestEndpoint>(
'openapi-v3:methods',
controller,
)
if (!methods) {
continue
}
for (const [method, endpoint] of Object.entries(methods)) {
if (endpoint.verb !== 'get') continue
const parameters = MetadataInspector.getAllParameterMetadata<ParameterObject>(
'openapi-v3:parameters',
controller,
method,
)
if (!parameters) continue
const index = parameters?.findIndex(
(parameter) => parameter?.name === 'filter' && parameter?.in === 'query',
)
const schema = parameters?.[index]?.content?.['application/json']?.schema
if (!schema || !('properties' in schema)) continue
const paramWithPivot = param.query.object('query', {
...schema,
properties: {
...schema.properties,
pivot: {
type: 'integer',
minimum: 0,
},
},
})
paramWithPivot(controller, method, index)
this.app.controller(controller.constructor)
}
}
}
}
@lifeCycleObserver('controller-overrider'))
导出类PivotModelsObserver实现LifeCycleObserver{
建造师(
@inject.tag(RepositoryTags.REPOSITORY)
公共存储库:crudepository[],
@inject.tag(CoreTags.CONTROLLER)
公共控制器:控制器类[],
@注入(CoreBindings.APPLICATION\u实例)
公共应用程序:CoreApplication,
) {}
/**
*此方法将在应用程序启动时调用
*/
异步启动():承诺{
for(此.controllers的常量控制器){
const methods=MetadataInspector.getAllMethodMetadata(
“openapi-v3:方法”,
控制器,
)
如果(!方法){
持续
}
for(Object.entries(methods,endpoint)的常量[method,endpoint]){
如果(endpoint.verb!=“get”)继续
常量参数=MetadataInspector.getAllParameterMetadata(
“openapi-v3:参数”,
控制器,
方法,,
)
如果(!参数)继续
常数索引=参数?.findIndex(
(参数)=>parameter?.name=='filter'和¶meter?.in=='query',
)
常量模式=参数?[index]?.content?['application/json']?.schema
如果(!架构| |!(“架构中的属性”)继续
const paramWithPivot=param.query.object('query'{
…模式,
特性:{
…schema.properties,
支点:{
键入:“整数”,
最低:0,
},
},
})
paramWithPivot(控制器、方法、索引)
this.app.controller(controller.constructor)
}
}
}
}
有更好的方法吗?我试图通过“openapi-v3:parameters”访问参数,但我不确定这样做是否可以,因为该键也可能会更改,但主要问题是当我打印到控制台或看到控制器的元数据时,一切正常,但我无法在模式(openapi.json)中看到它,如果我尝试使用该过滤器,则会抛出错误