【问题标题】:Typescript Error TS2339: Property 'project' does not exist on type '{}'Typescript 错误 TS2339:类型“{}”上不存在属性“项目”
【发布时间】:2016-09-07 08:11:51
【问题描述】:

在 Angular 2 RC1 中遇到这个老问题.. 非常令人沮丧的东西.. 有没有人知道我可以在这里做什么来编译..

导致错误的行是:

  this.project = res.project;

这是我的组件:

            import {Component} from '@angular/core';
            import {ProjectsMainApi} from "../../../services/projects-main";
            import { RouteConfig, RouteParams, ROUTER_DIRECTIVES, ROUTER_PROVIDERS } from '@angular/router-deprecated';

            declare var jQuery: any;

            @Component({
                selector: 'projects',
                templateUrl: './app/components/Projects/details/project-single.html',
                directives: [ROUTER_DIRECTIVES]
            })

            export class ProjectDetailsComponent {
                project: Object = {};
                constructor(private _api: ProjectsMainApi, private _params: RouteParams) {
                    this._api.getSinglePortfolio(_params.get("id")).then(
                        (res) => {
                            this.project = res.project;
                        },
                        (error) => {
                            console.error(error);
                        }
                    )
                }
            }

我的服务如下:

            import {Http, Headers, Response} from "@angular/http"
            import {Injectable} from "@angular/core"
            import {IProjectsMain, ISingleProject} from "../interfaces/AvailableInterfaces"
            import 'rxjs/Rx';
            import {Observable} from 'rxjs/Observable';
            import {Observer} from 'rxjs/Observer';
            import 'rxjs/add/operator/share';
            import 'rxjs/add/operator/map';

            @Injectable()
            export class ProjectsMainApi {
                apiUrl: string = "http://www.example.org/api/projects";
                headers: Headers = new Headers;
                project$: Observable<IProjectsMain[]>;
                private _ProjectsMainObserver: Observer<IProjectsMain[]>;
                private _dataStore: {
                    project: IProjectsMain[]
                };

                constructor(private _http: Http) {
                    this.headers.append('Content-Type', 'application/x-www-form-urlencoded');
                    this.headers.append('X-Requested-With', 'XMLHttpRequest');
                    this.project$ = new Observable<IProjectsMain[]>(observer => this._ProjectsMainObserver = observer).share();
                    this._dataStore = { project: [] };
                }

                public getProjectsMain() {
                    this._http.get(this.apiUrl).map(response => response.json()).subscribe(data => {
                        this._dataStore.project = data.project;
                        this._ProjectsMainObserver.next(this._dataStore.project);
                    }, error => console.log('Could not load projects.'),
                        () => "done");
                }

                public getSinglePortfolio(id) {
                    console.log("the id is" + id);
                    return new Promise((resolve, reject) => {
                        this._http.get(this.apiUrl + "/" + id).map((res: Response) => res.json()).subscribe(
                            (res) => {
                                //console.log(res);
                                resolve(res);
                            }, (error) => {
                                reject(error);
                            }
                            );
                    })
                }
            }

在这个组件中调用的函数是getSinglePortfolio(id)

和杰森

        {"project":[{"id":1,"title":"fdgdfgdfg","slug":"sdfgsdfgsdfg" },   {"id":2,"title":"fdgdfgdfg","slug":"sdfgsdfgsdfg" }]}

【问题讨论】:

    标签: angularjs-directive angular angular2-template angular2-directives angular2-services


    【解决方案1】:

    我认为这是打字稿编译器错误。 您可以为此定义自定义界面:

    import {Component} from '@angular/core';
    import {ProjectsMainApi} from "../../../services/projects-main";
    import { RouteConfig, RouteParams, ROUTER_DIRECTIVES, ROUTER_PROVIDERS } from '@angular/router-deprecated';
    
    declare var jQuery: any;
    
    interface ProjectResult {
      project: Object
    }
    
    @Component({
    ...
    

    然后为res参数指定类型:

     this._api.getSinglePortfolio(_params.get("id")).then(
      (res: ProjectResult ) => {
         this.project = res.project;
      },
      (error) => {
         console.error(error);
      }
    )
    

    完整的组件代码

    import {Component} from '@angular/core';
    import {ProjectsMainApi} from "../../../services/projects-main";
    import { RouteConfig, RouteParams, ROUTER_DIRECTIVES, ROUTER_PROVIDERS } from '@angular/router-deprecated';
    
    declare var jQuery: any;
    
    interface ProjectResult {
      project: Object
    }
    
    @Component({
        selector: 'projects',
        templateUrl: './app/components/Projects/details/project-single.html',
        directives: [ROUTER_DIRECTIVES]
    })
    
    export class ProjectDetailsComponent {
        project: Object = {};
        constructor(private _api: ProjectsMainApi, private _params: RouteParams) {
            this._api.getSinglePortfolio(_params.get("id")).then(
                (res: ProjectResult) => {
                    this.project = res.project;
                },
                (error) => {
                    console.error(error);
                }
            )
        }
    }
    

    【讨论】:

    • 甜,我在组件中定义了接口吗?
    • @user3461985 您可以在组件文件的import语句后定义接口
    • 我现在收到一个关于编译器错误 TS1206 的新错误:装饰器在此处无效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 2018-11-13
    • 2018-03-25
    • 2020-04-25
    • 1970-01-01
    相关资源
    最近更新 更多