2016-09-26 3 views
8

मैं अपने आवेदन में एक अंतरफलक है:एक टाइपप्रति इंटरफ़ेस वैकल्पिक भीतर सभी गुण बनाओ

interface Asset { 
    id: string; 
    internal_id: string; 
    usage: number; 
} 

कि एक पोस्ट इंटरफ़ेस का हिस्सा है:

interface Post { 
    asset: Asset; 
} 

मैं भी एक अंतरफलक एक के लिए है कि है पोस्ट मसौदा, जहां संपत्ति वस्तु केवल आंशिक रूप से निर्मित हो सकती है

interface PostDraft { 
    asset: Asset; 
} 

मैंको अनुमति देना चाहता हूंऑब्जेक्ट में आंशिक संपत्ति ऑब्जेक्ट होने के बावजूद वहां मौजूद गुणों पर प्रकारों की जांच कर रहे हैं (इसलिए मैं इसे any के साथ बस स्वैप नहीं करना चाहता हूं)। पूरी तरह से फिर से परिभाषित करने Asset इंटरफ़ेस के बिना

interface AssetDraft { 
    id?: string; 
    internal_id?: string; 
    usage?: number; 
} 

:

मैं मूल रूप से एक तरह से निम्नलिखित उत्पन्न करने में सक्षम होना चाहता हूँ। क्या इसे करने का कोई तरीका है? यदि नहीं, तो इस स्थिति में मेरे प्रकार की व्यवस्था करने का स्मार्ट तरीका क्या होगा?

+0

आज आपको उस दूसरे इंटरफ़ेस को मैन्युअल रूप से बनाने की आवश्यकता है, हालांकि यह निकट भविष्य में बदल सकता है: [आंशिक प्रकार] (https://github.com/Microsoft/TypeScript/issues/4889) समस्या को टीएस पर देखें यदि आप रुचि रखते हैं तो रेपो। –

उत्तर

18

नहीं यह वैकल्पिक गुणों के साथ एक अतिरिक्त इंटरफ़ेस बनाए बिना टाइपप्रति < 2.1 में संभव नहीं है; हालांकि, टाइपस्क्रिप्ट 2.1 में मैप किए गए प्रकारों का उपयोग करके यह संभव है। जो आपको ऐसा करने की अनुमति होगी

interface PostDraft { 
    asset: Partial<Asset>; 
} 

अब asset पर सभी संपत्तियां, वैकल्पिक हैं::

const postDraft: PostDraft = { 
    asset: { 
     id: "some-id" 
    } 
}; 

Read more about mapped types here

ऐसा करने के लिए, Partial<T> इंटरफ़ेस lib.d.ts में पाया का उपयोग करें।

+3

काम के घंटों के लिए धन्यवाद, आपने मुझे अभी बचाया <3! – aherve

+0

Woooooottt। आंशिक चाल है !!!! –

4

इंटरफ़ेस में गुण या तो वैकल्पिक हैं, आप वैकल्पिक रूप से एक बार एक ही इंटरफेस का उपयोग नहीं कर सकते हैं और एक बार जरूरी हो सकते हैं। यहाँ

interface AssetDraft { 
    id?: string; 
    internal_id?: string; 
    usage?: number; 
} 

class Asset { 
    static DEFAULT_ID = "id"; 
    static DEFAULT_INTERNAL_ID = "internalid"; 
    static DEFAULT_USAGE = 0; 

    id: string; 
    internal_id: string; 
    usage: number; 

    constructor(draft: AssetDraft) { 
     this.id = draft.id || Asset.DEFAULT_ID; 
     this.internal_id = draft.internal_id || Asset.DEFAULT_INTERNAL_ID; 
     this.usage = draft.usage || Asset.DEFAULT_USAGE; 
    } 
} 

मूलभूत मूल्यों स्थिर सदस्य हैं, लेकिन आप उन प्राप्त कर सकते हैं:

आप क्या कर सकते AssetDraft के लिए वैकल्पिक गुण और फिर Asset के लिए अनिवार्य गुणों के साथ एक वर्ग के साथ एक अंतरफलक है अन्य तरीकों से या अगर वे गायब हैं तो एक त्रुटि फेंक दें।

मैं जब jsons कि सर्वर (या कुछ इसी तरह) से प्राप्त होते हैं के साथ काम इस तरह से बहुत आराम मिल जाए, इंटरफेस json डेटा का प्रतिनिधित्व करते हैं और कक्षाओं वास्तविक मॉडल है कि प्रारंभिक मान के रूप में jsons का प्रयोग कर बनाया जाता है।

0

कैसे बल एक खाली वस्तु कास्टिंग के बारे में उदाहरण के

const draft = <PostDraft>{} draft.id = 123 draft.internal_id = 456 draft.usage = 789

तुम सच में वास्तव में इस तो आप हमेशा कि दोनों वैकल्पिक और टाइप गुण बनाता है खाके से d.ts इंटरफेस उत्पन्न कर सकते हैं की जरूरत है।

रूप Nitzan ने कहा, या तो टाइपप्रति इंटरफ़ेस गुण वैकल्पिक हैं या

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