2016-10-18 32 views
10

मैंने अभी कोणीय 2 के साथ शुरुआत की है और मुझे एक समस्या है जिसे मैं वास्तव में समझ नहीं सकता।संपत्ति '' ऑब्जेक्ट 'प्रकार पर मौजूद नहीं है। अवलोकन योग्य सदस्यता

मैं ऐसे के रूप में बनाया कुछ नकली डेटा है:

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" } 
    ] 
}; 

जो फिर एक सेवा में आयात किया जाता है और "मनाया"

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); 
    } 

} 

मैं तो एक घटक है जो, निर्माता में:

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

पहला console.log ऑब्जेक्ट प्रकार का ऑब्जेक्ट लॉग करता है जिसमें testDataArray प्रॉपर्टी होती है।

दूसरा console.log, संकलन समय पर एक त्रुटि में परिणाम:

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

जबकि अभी भी वस्तुओं की एक सरणी [वस्तु, वस्तु, ..] के रूप में इरादा प्रवेश करने।

मुझे वास्तव में समझ में नहीं आता क्यों, मुझे यकीन है कि मैं कुछ गलत कर रहा हूं, मुझे एक स्पष्टीकरण पसंद आएगा।

किसी भी मदद के लिए धन्यवाद!

उत्तर

7

जब आप के जवाब डेटा पर जोर टाइपस्क्रिप्ट बताएं:

WORKFLOW_DATA: Object

आप इसे कह रहे हैं कि WORKFLOW_DATA कोई विशेषताओं के साथ एक सादे वस्तु है। जब आप बाद में WORKFLOW_DATA.testDataArray तक पहुंचने का प्रयास करते हैं तो संकलक सोचता है कि आप इस प्रकार का दुरुपयोग करते हैं।

यदि आप WORKFLOW_DATA पर टाइपिंग टाइप करना चाहते हैं तो आपको अपनी ऑब्जेक्ट का वर्णन करने वाला इंटरफ़ेस बनाना होगा।

+0

आप देखते हैं, अन्य उत्तर किसी भी उपयोग करने का सुझाव कर सकते हैं, मैं व्यक्तिगत रूप से एक अंतरफलक सही तरीका इस्तेमाल कर रहा है की तरह लग रहा है, इस तरह के रूप में कुछ आसान के लिए थोड़ा verbose हालांकि। Angular2 के साथ सबसे अच्छा अभ्यास interfaces हैं? – 0plus1

+1

टाइप सिस्टम आपके लिए मदद करने के लिए है, खासकर जब एप्लिकेशन बढ़ता है। यदि आप नहीं चाहते हैं तो आपको इसका उपयोग करने की आवश्यकता नहीं है - इसका अंतिम जावास्क्रिप्ट पर कोई प्रभाव नहीं पड़ता है। मैं (और मुझे लगता है कि ज्यादातर अन्य) इस तरह एक स्मार्ट संपादक स्वतः पूर्ण प्रदान करता है और आपको गलतियों पर चेतावनी देता है। अगर यह मेरा कोड था, तो शायद मैं रिकॉर्ड्स के लिए एक प्रकार बनाउंगा - '{key: string, parent?: String ..} 'और संग्रह के लिए एक जिसमें रिकॉर्ड प्रकार -' {testDataArray: recordType [] है। .. या ऐसा कुछ। –

1

आपकी विधि Observable<Object> पर वापसी का प्रकार है। तो जब आप सब्सक्राइब करते हैं, तो वह प्रकार बीत जाएगा। और Object प्रकार पर testDataArray नहीं है। आप एक जोड़ी कर सकते हैं:

  1. प्रकार डेटा और वापसी प्रकार अलग ढंग से

    WORKFLOW_DATA: { testDataArray: any } = [] 
    
    getWorkflowForEditor(): Observable<{ testDataArray: any }> 
    
  2. या बस टाइप any

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

टाइपप्रति WORKFLOW_DATA उम्मीद Object यहाँ:

.subscribe(WORKFLOW_DATA => {}) 

क्योंकि आप इसे इतना कहा:

getWorkflowForEditor(): Observable<Object> 

लेकिन ObjecttestDataArray संपत्ति नहीं है ...आप या तो टाइपप्रति बताना चाहिए डेटा किसी भी गुण हो सकता है:

getWorkflowForEditor(): Observable<any> 

या का उपयोग

console.log(WORKFLOW_DATA["testDataArray"]); 
संबंधित मुद्दे