2016-03-30 6 views
7

चलें कहते हैं कि मैं एक वर्ग है:जांच करें कि एक वस्तु (या बस एक वर्ग) एक संपत्ति है

module MyModule { 
    export class MyClass { 
     x:number; 
     y:number; 
    } 
} 

तो मैं एक स्ट्रिंग है, "x"। मैं कैसे जांच सकता हूं कि MyClass की संपत्ति "x" है या नहीं?

अगर मैं MyClass का एक उदाहरण बनाने और उसके बाद कार्य करें:

myClassInstance.hasOwnProperty("x"); 

यह गलत रिटर्न जब तक एक्स एक डिफ़ॉल्ट मान सेट है। लेकिन मैं प्रत्येक संपत्ति के लिए डिफ़ॉल्ट मान निर्धारित नहीं करना चाहता हूं। यह सबसे अच्छा होगा अगर मैं MyClass के उदाहरण के बिना भी ऐसा कर सकता हूं।

+0

जरूरत है मैं टाइपप्रति स्तर में ऐसा करना चाहते हैं प्राप्त कर सकते हैं, नहीं जावास्क्रिप्ट। – zeroin

+2

रनस्क्रिप्ट रनटाइम पर मौजूद नहीं है। टाइपस्क्रिप्ट को इसे क्रियान्वित करने से पहले जावास्क्रिप्ट में अनुवादित किया जाता है। – NineBerry

+0

यदि आप समझाते हैं, तो आप रनटाइम पर कुछ संपत्ति की जांच क्यों करना चाहते हैं, हो सकता है कि आप जो भी प्रयास कर रहे हैं उसे प्राप्त करने का कोई और तरीका हो। – NineBerry

उत्तर

3

टाइपस्क्रिप्ट निष्पादन से पहले जावास्क्रिप्ट में संकलित किया गया है। अंतिम जावास्क्रिप्ट कोड में, टाइपस्क्रिप्ट से प्रकार की जानकारी अब उपलब्ध नहीं है। तो रनटाइम पर टाइपस्क्रिप्ट प्रकार की जानकारी जांचने की कोई संभावना नहीं है।


आप संकलन समय पर एक जांच करना चाहते हैं, तो आप निम्न उदाहरण में इंटरफेस का उपयोग कर सकते हैं:

interface IHasX 
{ 
    x:any; 
} 

class MyClassA { 
    x:number; 
    y:number; 
} 

class MyClassB { 
    y:number; 
} 

function Test(param: IHasX) 
{ 
    // Do something with param.x 
} 

var objA = new MyClassA(); 
var objB = new MyClassB(); 

Test(objA); 
Test(objB); 

अंतिम पंक्ति Test(objB); क्योंकि टाइपप्रति संकलक कि जानता है संकलित करने के लिए असफल हो जायेगी objB टाइप MyClassB है और उस श्रेणी में नामक कोई संपत्ति नहीं है, जो इंटरफ़ेस IHasX द्वारा आवश्यक है।

0

अब आप यह कर सकते हैं। मैंने टाइपस्क्रिप्ट कंपाइलर का एक उन्नत संस्करण जारी किया जो आपको कक्षा या इंटरफ़ेस के सभी सदस्यों को सूचीबद्ध करने की अनुमति देता है।

export class Person { 
    name: string; 
    surname: string; 
    age: number; 
    country: string; 
} 

function printMembers(clazz: Class) { 
    let fields = clazz.members.filter(m => m.type.kind !== 'function'); //exclude methods. 
    for(let field of fields) { 
     let typeName = field.type.kind; 
     if(typeName === 'class' || typeName === 'interface') { 
      typeName = (<Class | Interface>field.type).name; 
     } 
     console.log(`Field ${field.name} of ${clazz.name} has type: ${typeName}`); 
    } 
} 

//then, somewhere in your code: 
let p = new Person(); 
printMembers(p.constructor.getClass()); 

और इस उत्पादन है: उदाहरण के लिए आप निम्न कर सकते

$ node main.js 
Field name of Person has type: string 
Field surname of Person has type: string 
Field age of Person has type: number 
Field country of Person has type: string 

आप सभी विवरण आप here

संबंधित मुद्दे