2016-10-18 29 views
10

Tôi vừa mới bắt đầu với Angular2 và tôi gặp vấn đề mà tôi không thể hiểu được.Thuộc tính '' không tồn tại trên loại 'Đối tượng'. Đăng ký có thể theo dõi

Tôi có một số dữ liệu giả tạo như vậy:

export const WORKFLOW_DATA: Object = 
{ 
    "testDataArray" : [ 
     { key: "1",    name: "Don Meow", source: "cat1.png" }, 
     { key: "2", parent: "1", name: "Roquefort", source: "cat2.png" }, 
     { key: "3", parent: "1", name: "Toulouse", source: "cat3.png" }, 
     { key: "4", parent: "3", name: "Peppo", source: "cat4.png" }, 
     { key: "5", parent: "3", name: "Alonzo",  source: "cat5.png" }, 
     { key: "6", parent: "2", name: "Berlioz", source: "cat6.png" } 
    ] 
}; 

mà sau đó được nhập khẩu trong một dịch vụ và "quan sát"

import { Injectable } from '@angular/core'; 

import { WORKFLOW_DATA } from './../mock-data/workflow' 
import {Observable} from "rxjs"; 

@Injectable() 
export class ApiService { 

    constructor() { } 

    getWorkflowForEditor(): Observable<Object> 
    { 
     return Observable.of(WORKFLOW_DATA); 
    } 

} 

sau đó tôi có một thành phần trong đó, các nhà xây dựng:

constructor(private apiService: ApiService) 
    { 
     this.apiService.getWorkflowForEditor().subscribe(WORKFLOW_DATA => { 
      console.log(WORKFLOW_DATA); 
      console.log(WORKFLOW_DATA.testDataArray); 
     }); 
    } 

Bàn điều khiển đầu tiên ghi nhật ký đối tượng kiểu đối tượng chứa thuộc tính testDataArray.

Các console.log thứ hai, kết quả trong một lỗi tại thời gian biên dịch:

Property 'testDataArray' does not exist on type 'Object'. 

Trong khi vẫn đăng nhập một mảng của các đối tượng [Object, Object, ..] như dự định.

Tôi thực sự không hiểu tại sao, tôi chắc chắn tôi đang làm điều gì sai, tôi rất thích một lời giải thích.

Cảm ơn bạn đã được trợ giúp!

Trả lời

7

Khi bạn cho biết loại:

WORKFLOW_DATA: Object

Bạn đang nói rằng WORKFLOW_DATA là đối tượng đơn giản không có thuộc tính. Khi bạn cố gắng truy cập WORKFLOW_DATA.testDataArray trình biên dịch cho rằng bạn đã lạm dụng loại đó.

Nếu bạn muốn kiểm tra loại trên WORKFLOW_DATA bạn cần tạo giao diện mô tả đối tượng của bạn.

+0

Như bạn có thể thấy, câu trả lời khác đề nghị sử dụng bất kỳ, cá nhân tôi cảm thấy như sử dụng một giao diện được một cách chính xác, mặc dù một chút tiết cho một cái gì đó đơn giản như thế này. Giao diện có thực hành tốt nhất với Angular2 không? – 0plus1

+1

Hệ thống kiểu có sẵn để giúp bạn đặc biệt khi ứng dụng phát triển. Bạn không cần phải sử dụng bất kỳ của nó nếu bạn không muốn - nó không có hiệu lực trên javascript cuối cùng. Tôi (và tôi nghĩ rằng hầu hết những người khác) thích nó bởi vì một trình soạn thảo thông minh cung cấp tự động hoàn thành và cảnh báo bạn về việc phạm sai lầm. Nếu đây là mã của tôi, tôi có thể tạo một kiểu cho các bản ghi - '{key: string, parent?: String ..}' và một cho bộ sưu tập có chứa loại bản ghi - '{testDataArray: recordType []. ..' hoặc một cái gì đó như thế. –

1

Loại trả lại nếu phương thức của bạn là Observable<Object>. Vì vậy, khi bạn đăng ký, đó sẽ là loại được thông qua. Và không có testDataArray trên loại Object. Bạn có thể làm một vài điều:

  1. Loại dữ liệu và trở lại kiểu cách khác nhau

    WORKFLOW_DATA: { testDataArray: any } = [] 
    
    getWorkflowForEditor(): Observable<{ testDataArray: any }> 
    
  2. Hoặc chỉ cần gõ khẳng định các dữ liệu để đáp ứng any

    console.log((<any>WORKFLOW_DATA).testDataArray); 
    
13

nguyên cảo hy vọng WORKFLOW_DATAObject đây:

.subscribe(WORKFLOW_DATA => {}) 

vì bạn đã nói với nó như vậy:

getWorkflowForEditor(): Observable<Object> 

Nhưng Object không có testDataArray bất động sản ...Bạn có thể nên nói nguyên cảo rằng dữ liệu có thể có bất kỳ thuộc tính:

getWorkflowForEditor(): Observable<any> 

hoặc sử dụng

console.log(WORKFLOW_DATA["testDataArray"]); 
Các vấn đề liên quan