javascript - Osäker argument av typen `any` tilldelad en parameter av typen `Observable`


Jag har kod som returnerar data från backend

Här är det

 @Injectable()
export class DictionariesDatasourceFacadeService {
  public invoiceTemplate: IDataSource<IComboboxItem>;
  public replacedLegalEntity: IDataSource<IComboboxItem>;
  public salesOrderTemplate: IDataSource<IComboboxItem>;
  public deliveryNoteTemplate: IDataSource<IComboboxItem>;
  public createInvoiceAction: IDataSource<IComboboxItem>;
  public clientPortal: IDataSource<IComboboxItem>;

  private readonly dataSourceFactory = inject(DataSourceFactory);
  private readonly invoiceTemplateService = inject(InvoiceTemplateService);
  private readonly replacedLegalEntityService = inject(LegalEntityService);
  private readonly salesOrderTemplateService = inject(SalesOrderTemplateService);
  private readonly createInvoiceActionService = inject(CreateInvoiceActionService);
  private readonly deliveryNoteTemplateService = inject(DeliveryNoteTemplateService);
  private readonly clientPortalService = inject(ClientPortalService);

  public constructor() {
    this.init();
  }

  private init(): void {
    this.invoiceTemplate = this.createGenericDataSource(this.invoiceTemplateService.getSimpleInvoiceTemplates());
    this.replacedLegalEntity = this.createGenericDataSource(this.replacedLegalEntityService.getSimpleLegalEntities());
    this.salesOrderTemplate = this.createGenericDataSource(
      this.salesOrderTemplateService.getSimpleSalesOrderTemplates()
    );
    this.deliveryNoteTemplate = this.createGenericDataSource(
      this.deliveryNoteTemplateService.getSimpleDeliveryNoteTemplates()
    );
    this.createInvoiceAction = this.createGenericDataSource(
      this.createInvoiceActionService.getAlgorithms()
    );
    this.clientPortal = this.createGenericDataSource(this.clientPortalService.getActiveClientPortals());
  }

  private createGenericDataSource<T extends IComboboxItem>(method: Observable<T[]>): IDataSource<IComboboxItem> {
    return this.dataSourceFactory.createLocalDataSource(
      () => method.pipe(map(x => x.sort(sortByName))),
      filterByNameFn
    );
  }
}

På raden this.createInvoiceActionService.getAlgorithms() fick jag dessa fel.

Men jag ser inga any-typer

Här är getAlgorithms-koden

 @Injectable({
    providedIn: 'root'
})
export class CreateInvoiceActionService extends BaseHttpService {
    constructor(http: HttpClient) {
        super(getBasePath('app', '/api/v1/CreateInvoiceAction'), http);
    }

    public getAlgorithms(): Observable<$models.CreateInvoiceActionSimpleDTO[]> {
        return this.post<$models.ICreateInvoiceActionSimpleDTO[]>(
            `GetAlgorithms`,
        ).pipe($mappers.mapCollection($models.CreateInvoiceActionSimpleDTO));
    }
}

till exempel rad visar inte detta fel

  this.deliveryNoteTemplate = this.createGenericDataSource(
      this.deliveryNoteTemplateService.getSimpleDeliveryNoteTemplates()
    );

och här är genererad kod

Hur kan jag lösa detta fel?

Svar #1

Enligt min förståelse behöver vi definiera den generiska typen T i nedanstående typdefinition.

  private createGenericDataSource<T extends IComboboxItem>(method: 
  Observable<T[]>): IDataSource<IComboboxItem> {
    return this.dataSourceFactory.createLocalDataSource(
      () => method.pipe(map(x => x.sort(sortByName))),
      filterByNameFn
    );
  }

Eftersom getAlgorithms returnerar en observabel av typen $models.CreateInvoiceActionSimpleDTO, kanske inkludering av denna typ som T löser ditt problem!

this.createInvoiceAction = this.createGenericDataSource<$models.CreateInvoiceActionSimpleDTO>( // <-changed here!
  this.createInvoiceActionService.getAlgorithms()
);