代码之家  ›  专栏  ›  技术社区  ›  Atticus29

错误TS2339:类型“observable<foo>”和其他RXJS V.6错误上不存在属性“takeUntil”

  •  9
  • Atticus29  · 技术社区  · 7 年前

    我最近刚在我的角度项目中更新了很多包。

    旧包.json:

    {
      "name": "data-jitsu",
      "version": "0.0.0",
      "license": "MIT",
      "scripts": {
        "ng": "ng",
        "start": "ng serve",
        "build": "ng build",
        "test": "ng test",
        "lint": "ng lint",
        "e2e": "ng e2e"
      },
      "private": true,
      "dependencies": {
        "@angular/animations": "^5.2.10",
        "@angular/cdk": "^5.2.5",
        "@angular/common": "5.2.7",
        "@angular/compiler": "5.2.7",
        "@angular/core": "5.2.7",
        "@angular/forms": "5.2.7",
        "@angular/http": "5.2.7",
        "@angular/material": "^5.2.5",
        "@angular/platform-browser": "5.2.7",
        "@angular/platform-browser-dynamic": "5.2.7",
        "@angular/router": "5.2.7",
        "@types/youtube": "0.0.29",
        "angular-froala-wysiwyg": "^2.7.2-1",
        "angular2-materialize": "^15.1.10",
        "angularfire2": "^4.0.0-rc0",
        "core-js": "^2.4.1",
        "d3": "^4.13.0",
        "firebase": "^3.9.0",
        "hammerjs": "^2.0.8",
        "jquery": "^3.0.0",
        "materialize-css": "^0.100.2",
        "ngx-youtube-player": "0.0.41",
        "rxjs": "^5.5.6",
        "zone.js": "^0.8.4"
      },
      "devDependencies": {
        "@angular/cli": "1.7.2",
        "@angular/compiler-cli": "5.2.7",
        "@types/bootstrap": "^3.3.36",
        "@types/d3": "^4.13.0",
        "@types/jasmine": "2.5.38",
        "@types/node": "~6.0.60",
        "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": "~2.0.0",
        "tslint": "~4.5.0",
        "typescript": "2.6.2"
      }
    }
    

    新package.json:

    {
      "name": "data-jitsu",
      "version": "0.0.0",
      "license": "MIT",
      "scripts": {
        "ng": "ng",
        "start": "ng serve",
        "build": "ng build",
        "test": "ng test",
        "lint": "ng lint",
        "e2e": "ng e2e"
      },
      "private": true,
      "dependencies": {
        "@angular/animations": "^6.0.3",
        "@angular/cdk": "^6.3.1",
        "@angular/common": "^6.0.3",
        "@angular/compiler": "^6.0.3",
        "@angular/core": "^6.0.3",
        "@angular/forms": "^6.0.3",
        "@angular/http": "^6.0.3",
        "@angular/material": "^6.2.0",
        "@angular/platform-browser": "^6.0.3",
        "@angular/platform-browser-dynamic": "^6.0.3",
        "@angular/router": "^6.0.3",
        "@types/youtube": "^0.0.29",
        "angular-froala-wysiwyg": "^2.7.2-1",
        "angular2-materialize": "^15.1.10",
        "angularfire2": "^5.0.0-rc.11",
        "core-js": "^2.4.1",
        "d3": "^4.13.0",
        "firebase": "^5.0.3",
        "hammerjs": "^2.0.8",
        "jquery": "^3.0.0",
        "materialize-css": "^0.100.2",
        "ngx-youtube-player": "0.0.41",
        "rxjs": "^6.2.1",
        "zone.js": "^0.8.26"
      },
      "devDependencies": {
        "@angular-devkit/build-angular": "~0.6.8",
        "@angular/cli": "~6.0.8",
        "@angular/compiler-cli": "^6.0.3",
        "@angular/language-service": "^6.0.3",
        "@types/bootstrap": "^3.3.36",
        "@types/d3": "^4.13.0",
        "@types/jasmine": "~2.8.6",
        "@types/jasminewd2": "~2.0.3",
        "@types/node": "^10.5.1",
        "codelyzer": "~4.2.1",
        "jasmine-core": "~2.99.1",
        "jasmine-spec-reporter": "~4.2.1",
        "karma": "~1.7.1",
        "karma-chrome-launcher": "~2.2.0",
        "karma-cli": "~1.0.1",
        "karma-coverage-istanbul-reporter": "~2.0.0",
        "karma-jasmine": "~1.1.1",
        "karma-jasmine-html-reporter": "^0.2.2",
        "protractor": "~5.3.0",
        "ts-node": "~5.0.1",
        "tslint": "~5.9.1",
        "typescript": "~2.7.2"
      }
    }
    

    当我跑步时 npm install 使用新的package.json更新,然后 ng serve ,我得到许多编译错误:

    src/app/all matches/all matches.component.ts(35,39)中出错:错误 TS2339:类型上不存在属性“takeUntil” “可观察”。src/app/app.component.ts(28,39):错误ts2339: 类型“Observable”上不存在属性“TakeUntil”。 src/app/authorization.service.ts(19,41):错误ts2339:属性'of' “typeof observable”类型上不存在。 src/app/authorization.service.ts(29,37):错误ts2339:属性'of' “typeof observable”类型上不存在。 src/app/authorization.service.ts(42,39):错误ts2339:属性'of' “typeof observable”类型上不存在。 src/app/authorization.service.ts(66,39):错误ts2339:属性'of' “typeof observable”类型上不存在。 src/app/authorization.service.ts(74,37):错误ts2339:属性'of' “typeof observable”类型上不存在。 src/app/authorization.service.ts(82,39):错误ts2339:属性'of' “typeof observable”类型上不存在。 src/app/database.service.ts(7,31):错误ts2305:模块 '“/users/mf/desktop/datajitsu/node_modules/angularfire2/database/index”' 没有导出成员“FireBaseListObservable”。 src/app/database.service.ts(7,55):错误ts2305:模块 '“/users/mf/desktop/datajitsu/node_modules/angularfire2/database/index”' 没有导出成员“FireBaseObjectObservable”。 src/app/match display/match display.component.ts(27,49):错误TS2339: 类型“angularFireObject<>”上不存在属性“takeUntil”。 src/app/new match/new match.component.ts(10,30):错误TS2305:模块 '“/users/mf/desktop/datajitsu/node_modules/angularfire2/database/index”' 没有导出成员“FireBaseListObservable”。 src/app/new match/new match.component.ts(10,54):错误TS2305:模块 '“/users/mf/desktop/datajitsu/node_modules/angularfire2/database/index”' 没有导出成员“FireBaseObjectObservable”。 src/app/new match/new match.component.ts(130,37):错误TS2339: 属性“switchmap”在类型“observable”上不存在。 src/app/protection.guard.ts(14,34):错误ts2339:属性“map”为 “observable”类型上不存在。 src/app/test db/test db.component.ts(7,30):错误ts2305:模块 '“/users/mf/desktop/datajitsu/node_modules/angularfire2/database/index”' 没有导出成员“FireBaseListObservable”。 src/app/test db/test db.component.ts(7,54):错误ts2305:模块 '“/users/mf/desktop/datajitsu/node_modules/angularfire2/database/index”' 没有导出成员“FireBaseObjectObservable”。 src/app/user status report/user status report.component.ts(28,39): 错误TS2339:类型上不存在属性“takeUntil” “可观察”。 src/app/user status report/user status report.component.ts(33,45): 错误TS2339:类型上不存在属性“subscribe” 'AngularFireObject<>'。 src/app/user status report/user status report.component.ts(35,56): 错误TS2339:类型上不存在属性“takeUntil” 'AngularFireObject<>'。 src/app/用户状态报告/用户状态报告.component.ts(43,66): 错误TS2339:类型上不存在属性“takeUntil” 'AngularFireObject<>'。

    这些错误中的大多数似乎都与RXJS有关,我认为这是正确的,因为我在更新中使用了RXJS V.6,我的理解是许多东西在V.5和V.6之间被破坏了。

    我玩过安装RXJS Compat npm install rxjs@6 rxjs-compat@6 --save 我可以确认这个包,除了作为一个重要的附加,不能解决我看到的任何错误。

    根据建议,我还通过运行ts lint实现了一些更新的自动化。 here here 以下内容:

    npm i -g rxjs-tslint
    rxjs-5-to-6-migrate -p [path/to/tsconfig.json]
    

    我收到以下信息:

    没有为javascript文件指定有效的规则

    我猜这意味着我在使用RXJS时没有使用合适的TS约定?

    在RXJS方面,我仍然相当无能,所以我不清楚还需要重构什么。

    但我认为我的问题实际上发生在蠕虫重构之前:

    我看了一下第一个错误

    错误TS2339:类型“Observable”上不存在属性“TakeUntil”

    一个)。错误来自我的身份验证服务中的一个方法。在该服务顶部的import语句(以及其他大多数.ts文件)中,我的IDE突出显示了许多“找不到模块foo”错误(例如,import语句的“找不到模块”、“rxjs”), import { Observable } from 'rxjs'; )。

    同一文件中的类似错误:

    import { Injectable, EventEmitter } from '@angular/core'; (“找不到模块,”@angular/core“)

    import * as firebase from 'firebase/app'; (“找不到模块”,firebase/app)

    import { Router } from '@angular/router'; (“找不到模块,”@angular/router”)

    以下是我的app.module.ts文件,以防有用:

    import { MaterializeModule } from 'angular2-materialize'
    import { BrowserModule } from '@angular/platform-browser';
    import { NgModule } from '@angular/core';
    import { FormsModule, ReactiveFormsModule } from '@angular/forms';
    import { HttpModule } from '@angular/http';
    import { masterFirebaseConfig } from './api-keys';
    import { AngularFireModule } from 'angularfire2';
    import { AngularFireDatabaseModule } from 'angularfire2/database';
    import { AppComponent } from './app.component';
    import { YoutubeComponent } from './youtube/youtube.component';
    import { routing } from './app.routing';
    import { NewMatchComponent } from './new-match/new-match.component';
    import { CreateAccountComponent } from './create-account/create-account.component';
    import { TestDbComponent } from './test-db/test-db.component';
    import { LandingComponent } from './landing/landing.component';
    import { MatchDisplayComponent } from './match-display/match-display.component';
    import { AuthorizationService } from './authorization.service';
    import { AngularFireAuthModule } from 'angularfire2/auth';
    import { DatabaseService } from './database.service';
    import { TextTransformationService } from './text-transformation.service';
    import { ValidationService } from './validation.service';
    import { LoginComponent } from './login/login.component';
    import { ProtectionGuard } from './protection.guard';
    import { AllMatchesComponent } from './all-matches/all-matches.component';
    import { AnnotationDisplayComponent } from './annotation-display/annotation-display.component';
    import { D3Service } from './d3.service';
    import { NotfoundComponent } from './notfound/notfound.component';
    import { UserStatusReportComponent } from './user-status-report/user-status-report.component';
    import { PaymentOrAnnotationDetailsComponent } from './payment-or-annotation-details/payment-or-annotation-details.component';
    import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
    import { MatSlideToggleModule } from '@angular/material/slide-toggle';
    import { MatSelectModule } from '@angular/material/select';
    import { MatOptionModule } from '@angular/material/core';
    import { MatInputModule } from '@angular/material/input';
    import { MatFormFieldModule } from '@angular/material';
    import { MatTableModule } from '@angular/material/table';
    // import { MatTreeModule } from '@angular/material';
    import { MatTreeModule } from '@angular/material/tree';
    import { MatSortModule } from '@angular/material';
    import { MatDatepickerModule, MatNativeDateModule, MatPaginatorModule } from '@angular/material';
    import {MatProgressSpinnerModule} from '@angular/material/progress-spinner';
    import { CdkTreeModule } from '@angular/cdk/tree';
    
    
    export const firebaseConfig = {
      apiKey: masterFirebaseConfig.apiKey,
      authDomain: masterFirebaseConfig.authDomain,
      databaseURL: masterFirebaseConfig.databaseURL,
      storageBucket: masterFirebaseConfig.storageBucket
    };
    
    @NgModule({
      declarations: [
        AppComponent,
        YoutubeComponent,
        NewMatchComponent,
        CreateAccountComponent,
        TestDbComponent,
        LandingComponent,
        MatchDisplayComponent,
        LoginComponent,
        AllMatchesComponent,
        AnnotationDisplayComponent,
        NotfoundComponent,
        UserStatusReportComponent,
        PaymentOrAnnotationDetailsComponent
      ],
      imports: [
        BrowserModule,
        FormsModule,
        HttpModule,
        routing,
        MaterializeModule,
        ReactiveFormsModule,
        AngularFireModule.initializeApp(firebaseConfig),
        AngularFireDatabaseModule,
        AngularFireAuthModule,
        BrowserAnimationsModule,
        MatSlideToggleModule,
        CdkTreeModule,
        MatSelectModule,
        MatOptionModule,
        MatInputModule,
        MatNativeDateModule,
        MatDatepickerModule,
        MatTableModule,
        MatSelectModule,
        MatSortModule,
        MatProgressSpinnerModule,
        MatPaginatorModule,
        MatTreeModule
      ],
      providers: [AuthorizationService, DatabaseService, ProtectionGuard, D3Service, ValidationService, TextTransformationService],
      bootstrap: [AppComponent]
    })
    export class AppModule { }
    

    这里是回购协议的分支机构,包含所有这些问题。

    git clone https://github.com/Atticus29/dataJitsu.git
    cd dataJitsu
    git checkout version-hell-SO 
    npm install
    ng serve
    

    欢迎并鼓励针对导入问题的任何故障排除提示或直接解决方案!

    1 回复  |  直到 6 年前
        1
  •  24
  •   madjaoue    7 年前

    看起来您的运营商仍然以RxJS5.x的方式被链接。

    1. 进口是不同的。现在,您应该导入Observable、Subject、BehaviorSubject等,以及不同于“rxjs/add/observable”中的方法。所以所有这些都必须从“rxjs”导入。例如:

      import {Observable, Subject, of, from} from 'rxjs'

      或者,所有操作符,如map、concat、do(现在称为tap)等,都将从导入 rxjs/operators

      import { map, tap, takeUntil} from 'rxjs/operators';

    2. this.authService.getCurrentUser().takeUntil(this.ngUnsubscribe).subscribe(user=>{

      通过

      this.authService.getCurrentUser().pipe(takeUntil(this.ngUnsubscribe)).subscribe(user=>{

      Observable.of(true) of(true) .

    3. 关于自定义文件的导入错误,请检查文件是否实际存在。例如:

      ERROR in src/app/app.module.ts(6,38): error TS2307: Cannot find module './api-keys'

      import { masterFirebaseConfig } from './api-keys'

      是正常的,因为文件“./api keys”不存在。

    4. 最后,关于angularfire5.0,您应该使用以下运算符之一:

      Db.list('items').subscribe(console.log)

      Db.list<Item>('items').valueChanges().subscribe(console.log)

      https://github.com/angular/angularfire2/blob/master/docs/version-5-upgrade.md

    祝你好运!

    推荐文章