【问题标题】:Argument of type '{ query: {}; }' is not assignable to parameter of type 'QueryFn''{ query: {}; 类型的参数}' 不可分配给“QueryFn”类型的参数
【发布时间】:2018-07-19 09:03:57
【问题描述】:

我正在构建一个角度应用程序,我必须在其中从 firebase 数据库上传和检索图像。我可以成功上传图片,但为了检索,我有以下代码

service.ts

getFileUploads(query = {}) {
this.fileUploads = this.db.list(this.basePath, {
  query: query
});
return this.fileUploads
}

我不断收到错误

'{ query: {}; 类型的参数}' 不可分配给“QueryFn”类型的参数。

对象字面量只能指定已知属性,而“QueryFn”类型中不存在“query”。

以下是整个service.ts代码

import {Injectable} from '@angular/core';
import {AngularFireDatabase, AngularFireList} from 'angularfire2/database';
import * as firebase from 'firebase';

import {FileUpload} from '../profile/fileupload';

@Injectable()
export class UploadFileService {

  constructor(private db: AngularFireDatabase) {}

  private basePath = '/uploads';
  fileUploads: AngularFireList<FileUpload[]>;

  pushFileToStorage(fileUpload: FileUpload, progress: {percentage: number}) 
 {
const storageRef = firebase.storage().ref();
const uploadTask = storageRef.child(`${this.basePath}/${fileUpload.file.name}`).put(fileUpload.file);

uploadTask.on(firebase.storage.TaskEvent.STATE_CHANGED,
  (snapshot) => {
    // in progress
    const snap = snapshot as firebase.storage.UploadTaskSnapshot
    progress.percentage = Math.round((snap.bytesTransferred / snap.totalBytes) * 100)
  },
  (error) => {
    // fail
    console.log(error)
  },
  () => {
    // success
    fileUpload.url = uploadTask.snapshot.downloadURL
    fileUpload.name = fileUpload.file.name
    this.saveFileData(fileUpload)
  }
);
}

 private saveFileData(fileUpload: FileUpload) {
  this.db.list(`${this.basePath}/`).push(fileUpload);
}

 getFileUploads(query = {}) {
this.fileUploads = this.db.list(this.basePath, {
  query: query
});
return this.fileUploads;
}
}

以下是我要显示图像的组件的component.ts

import { Component, OnInit } from '@angular/core';
import { ItemService } from '../services/item.service';
import {FileUpload} from '../profile/fileupload';
import {UploadFileService} from '../services/upload-file.service';
import { AngularFireDatabase, AngularFireList } from 'angularfire2/database'; 

@Component({
  selector: 'app-admin',
  templateUrl: './admin.component.html',
  styleUrls: ['./admin.component.css']
})
export class AdminComponent implements OnInit {

  fileUploads: AngularFireList<FileUpload[]>;

  constructor(private uploadService: UploadFileService) { }

  ngOnInit() {
    this.fileUploads = this.uploadService.getFileUploads({l});
  }
}

【问题讨论】:

  • 你使用的是什么版本
  • @waploaj Angular5。我必须导入任何东西吗?
  • import { AngularFireDatabase, AngularFireList } from 'angularfire2/database';了吗
  • @waploaj 是的,我有

标签: angular typescript firebase firebase-realtime-database angularfire2


【解决方案1】:

带有 angularfire2 的 documentation for list querying 表明 list() 方法的第二个参数应该是函数而不是对象。

具体来说,list() from here 的方法定义表明它属于该类型

list<T>(pathOrRef: PathReference, queryFn?: QueryFn): AngularFireList<T>

QueryFn(定义here)属于这种类型

type QueryFn = (ref: DatabaseReference) => DatabaseQuery;

所以错误是正确的,它期望您将函数作为第二个参数而不是对象传递。

由于您自己的 query 参数没有您在此处发布的类型定义,因此我很难准确说出您认为 getFileUploads 方法的调用者会传入什么,但很可能您需要在该对象类型和 angularfire 所期望的 QueryFn 类型之间进行某种转换。

【讨论】:

  • 我现在在问题中添加了更多相关代码。如果可以,请看一下。
猜你喜欢
  • 2019-06-24
  • 2021-06-14
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 2020-03-20
  • 1970-01-01
相关资源
最近更新 更多