2015-10-19 20 views
16

में Destructuring साथ पैरामीटर गुण आशुलिपि का मेल टाइपप्रति, जब हम स्वचालित रूप से निर्माता परिभाषा से हमारी कक्षा में गुण बनाना चाहते हैं, हम जैसे पैरामीटर गुण आशुलिपि का लाभ उठा सकते हैं:टाइपप्रति

class Person { 
    constructor(public firstName : string, public lastName : number, public age : number) { 

    } 
} 

और तो, transpiled जावास्क्रिप्ट हो जाएगा:

var Person = (function() { 
    function Person(firstName, lastName, age) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.age = age; 
    } 
    return Person; 
})(); 

लेकिन अगर हम हमारे निर्माता में एक वस्तु प्राप्त करना चाहते हैं, यह की तरह कुछ होगा:

class Person { 
    constructor({firstName, lastName, age} : {firstName: string, lastName: string, age: number}) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.age = age; 
    } 
} 

प्रश्न:

interface IPerson { 
    firstName : string, 
    lastName : string, 
    age: number 
} 

class Person { 
    constructor(person : IPerson) { 
     this.firstName = person.firstName; 
     this.lastName = person.lastName; 
     this.age = person.age; 
    } 
} 

टाइपप्रति 1.5 बाद से, हम उदाहरण के destructuring का लाभ उठा सकते हैं कैसे टाइपप्रति में पैरामीटर गुण आशुलिपि और Destructuring गठबंधन करने के लिए?

मैं, वस्तु परिभाषा से पहले public परिभाषित करने के लिए कोशिश की है उदाहरण के लिए:

class Person { 
    constructor(public {firstName, lastName, age} : {firstName: string, lastName: string, age: number}) { 

    } 
} 

प्रत्येक चर से पहले इसे परिभाषित करने की कोशिश की, उदाहरण के लिए:

class Person { 
    constructor({public firstName, public lastName, public age} : {firstName: string, lastName: string, age: number}) { 

    } 
} 

लेकिन मुझे कोई सफलता मिली। कोई विचार?

उत्तर

3

वर्तमान में इस छोटे से हाथ करने के लिए एक रास्ता नहीं है, तो निकटतम आप प्राप्त कर सकते हैं पूरे अक्षरों में लिखावट गुण घोषित करने और destructuring काम से चर आवंटित करने के लिए है: तुम क्या कर रहे हैं, तो

class Person { 
    firstName: string; 
    lastName: string; 
    age: number; 

    constructor({firstName, lastName, age} : {firstName: string, lastName: string, age: number}) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.age = age; 
    } 
} 

कि ... आप शायद IPerson स्वीकार करने का निर्णय लेंगे और कन्स्ट्रक्टर में विनाशकारी का उपयोग किये बिना अपने सदस्यों को असाइन करेंगे।

1

एक और रणनीति एक अलग नाम के चर को असाइन करने की क्षमता का उपयोग करना है। यह कन्स्ट्रक्टर में एक पुनरावृत्ति पर कटौती करता है।

class Person { 
    firstName: string; 
    lastName: string; 
    age: number; 

    constructor(args: { firstName: string, lastName: string, age: number, }) { 
     ({ 
      firstName: this.firstName, 
      lastName: this.lastName, 
      age: this.age, 
     } = args); 
    } 
} 

आप किसी इंटरफ़ेस में कन्स्ट्रक्टर में परिभाषाओं में से एक को भी स्थानांतरित कर सकते हैं।

interface PersonConstructorArgs { 
    firstName: string; 
    lastName: string; 
    age: number; 
} 
class Person { 
    firstName: string; 
    lastName: string; 
    age: number; 

    constructor(args: PersonConstructorArgs) { 
     ({ 
      firstName: this.firstName, 
      lastName: this.lastName, 
      age: this.age, 
     } = args); 
    } 
} 

यह आपके लिए पदानुक्रम होने पर उपयोगी होगा।

interface PersonConstructorArgs { 
    firstName: string; 
    lastName: string; 
    age: number; 
} 
class Person { 
    firstName: string; 
    lastName: string; 
    age: number; 

    constructor(args: PersonConstructorArgs) { 
     ({ 
      firstName: this.firstName, 
      lastName: this.lastName, 
      age: this.age, 
     } = args); 
    } 
} 
interface EmployeeConstructorArgs extends PersonConstructorArgs { 
    manager: Person; 
} 
class Employee extends Person { 
    manager: Person; 

    constructor(args: EmployeeConstructorArgs) { 
     super(args); 
     ({ 
      manager: this.manager, 
     } = args); 
    } 
} 
+0

क्या आपको पता है कि ब्रांड्स के भीतर विनाशकारी असाइनमेंट को लपेटना क्यों आवश्यक है? मेरा मतलब है उदा। बाहरी '()' '({प्रबंधक: this.manager} = args);'। मैंने पाया कि जब ऑब्जेक्ट गुणों पर मैपिंग आवश्यक हो (जैसे * यह।प्रबंधक *), जबकि स्थानीय चरों पर मैपिंग करते समय आमतौर पर उनकी आवश्यकता नहीं होती है – superjos

+1

[ऑब्जेक्ट डिस्ट्रक्चरिंग सेक्शन] में एक नोट है (https://www.typescriptlang.org/docs/handbook/variable-declarations.html#object- विनाशकारी) टाइपस्क्रिप्ट हैंडबुक का कहना है, "ध्यान दें कि हमें इस कथन को कोष्ठक के साथ घेरना पड़ा था। जावास्क्रिप्ट सामान्य रूप से {ब्लॉक की शुरुआत के रूप में) को पार करता है। तो कारण यह है कि ऐसा लगता है कि यह एक वस्तु विनाश के बजाय एक ब्लॉक था। – Schmalls

1

आप Object.assign के लिए उपयोग किया है, तो यह काम करता है:

class PersonData { 
    firstName: string 
    constructor(args : PersonData) { 
    Object.assign(this, args) 
    } 
} 

class Person extends PersonData{} 

लेकिन नए उदाहरणों ध्यान दें आर्ग में कुछ भी की आबादी हो जाएगा - तुम सिर्फ चाबियाँ आप चाहते हैं को निकाल देते हैं नहीं कर सकते उपयोग करने के लिए।