【发布时间】:2018-01-05 07:34:34
【问题描述】:
我有一个 Angular 4 项目,我将文件上传到 Firebase 存储。我将上传程序代码基于 angular-firestarter。如果我运行此代码,它工作正常。
我已经在我的代码中包含了 upload.service.ts 并且它工作ed很好,但是在离开它一段时间后,upload.service.ts 将不再编译。我收到一个错误:'() 类型的参数 => void' 不可分配给“取消订阅”类型的参数。 类型 'void' 不能分配给类型 'undefined'。关于看起来像这样的函数:
pushUpload(upload: Upload, desktopKey: string) {
const storageRef = firebase.storage().ref();
const uploadTask = storageRef.child(`${this.basePath}/${upload.file.name}`).put(upload.file);
uploadTask.on(firebase.storage.TaskEvent.STATE_CHANGED,
(snapshot: any) => {
// upload in progress
upload.progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
},
(error) => {
// upload failed
console.log(error);
},
() => {
// upload success
upload.url = uploadTask.snapshot.downloadURL;
upload.name = upload.file.name;
this.saveDocumentData(upload, desktopKey);
}
);
}
在我的项目中似乎这个 on 函数的定义是错误的(如果我将它注释掉,应用程序可以正常工作)。关于什么可能导致此类问题以及如何解决它的任何想法?
如果我比较两个项目的 firebase.d.ts 文件,尽管两个项目在 package.json 中都有 "firebase": "^4.1.3",但它们有点不同
来自 angular-firestarter
interface UploadTask {
cancel ( ) : boolean ;
catch (onRejected : (a : Error ) => any ) : firebase.Promise < any > ;
on (event : firebase.storage.TaskEvent , nextOrObserver ? : null | Object , error ? : ( (a : Error ) => any ) | null , complete ? : ( ( ) => any ) | null ) : Function ;
pause ( ) : boolean ;
resume ( ) : boolean ;
snapshot : firebase.storage.UploadTaskSnapshot ;
then (onFulfilled ? : ( (a : firebase.storage.UploadTaskSnapshot ) => any ) | null , onRejected ? : ( (a : Error ) => any ) | null ) : firebase.Promise < any > ;
}
来自我的项目:
interface UploadTask {
cancel ( ) : boolean ;
catch (onRejected : (a : Error ) => any ) : firebase.Promise < any > ;
on (event : firebase.storage.TaskEvent , nextOrObserver ? : firebase.Observer < any , any > | null | ( (a : Object ) => any ) , error ? : ( (a : Error ) => any ) | null , complete ? : ( firebase.Unsubscribe ) | null ) : Function ;
pause ( ) : boolean ;
resume ( ) : boolean ;
snapshot : firebase.storage.UploadTaskSnapshot ;
then (onFulfilled ? : ( (a : firebase.storage.UploadTaskSnapshot ) => any ) | null , onRejected ? : ( (a : Error ) => any ) | null ) : firebase.Promise < any > ;
}
我已删除 node_modules 和 package-lock.json 并运行 npm install,但没有帮助。
我还尝试从包含 node_modules 的备份中恢复我的项目,然后它可以工作,但是当我删除 node_modules 和 package-lock.json 和 npm install 时,我得到了错误。
所以知道为什么我在我的项目中得到一个错误的类型定义文件,即使我安装了相同版本的 firebase?
我的 package.json 文件;
{
"name": "docavea",
"version": "0.0.0",
"license": "MIT",
"scripts": {
"ng": "ng",
"start": "ng serve --o",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e",
"populate-db": "./node_modules/.bin/ts-node ./populate-db.ts",
"populate-db2": "./node_modules/.bin/ts-node ./populate-db2.ts"
},
"private": true,
"dependencies": {
"@angular/animations": "^4.3.2",
"@angular/common": "^4.3.2",
"@angular/compiler": "^4.3.2",
"@angular/core": "^4.3.2",
"@angular/flex-layout": "^2.0.0-beta.8",
"@angular/forms": "^4.3.2",
"@angular/http": "^4.3.2",
"@angular/platform-browser": "^4.3.2",
"@angular/platform-browser-dynamic": "^4.3.2",
"@angular/platform-server": "^4.3.2",
"@angular/router": "^4.3.2",
"angularfire2": "^4.0.0-rc.1",
"core-js": "^2.4.1",
"firebase": "^4.1.3",
"global": "^4.3.2",
"lodash": "^4.17.4",
"ng2-pdf-viewer": "^1.1.0",
"ngx-bootstrap": "^1.7.1",
"rxjs": "^5.4.2",
"zone.js": "^0.8.12"
},
"devDependencies": {
"@angular/cli": "^1.2.6",
"@angular/compiler-cli": "^4.3.2",
"@types/jasmine": "2.5.38",
"@types/node": "~6.0.60",
"@types/lodash": "^4.14.67",
"codelyzer": "~2.0.0",
"jasmine-core": "~2.5.2",
"jasmine-spec-reporter": "~3.2.0",
"karma": "~1.4.1",
"karma-chrome-launcher": "~2.0.0",
"karma-cli": "~1.0.1",
"karma-coverage-istanbul-reporter": "^0.2.0",
"karma-jasmine": "~1.1.0",
"karma-jasmine-html-reporter": "^0.2.2",
"protractor": "~5.1.0",
"ts-node": "^3.1.0",
"tslint": "~4.5.0",
"typescript": "^2.4.2"
}
}
【问题讨论】:
-
不用看得太仔细,至少可以将
this的范围与function()分开,而是使用粗箭头语法() =>更多:stackoverflow.com/questions/20279484/… -
^4.1.3 表示不更改主要版本 (4) 的任何版本,最新可用的是 4.2.0,并且将在您运行 npm install 时安装。如果您将范围限定到该确切版本,则意味着删除 ^ 它应该可以正常工作。可能他们在其中一个较新版本中更改了函数定义。
标签: angular typescript firebase visual-studio-code