क्या टाइपस्क्रिप्ट इंटरफ़ेस संपत्ति के प्रकार को "निकालने" का एक तरीका है?


124

मान लीजिए कि लाइब्रेरी X के लिए एक टाइपिंग फ़ाइल है जिसमें कुछ इंटरफेस शामिल हैं।

interface I1 {
    x: any;
}

interface I2 {
    y: {
        a: I1,
        b: I1,
        c: I1
    }
    z: any
}

इस पुस्तकालय के साथ काम करने के लिए मुझे एक वस्तु के आसपास से गुजरने की आवश्यकता होती है जो बिल्कुल उसी प्रकार की होती है जैसे कि I2.y। मैं अपने स्रोत फ़ाइलों में समान इंटरफ़ेस बना सकता हूं:

interface MyInterface {
    a: I1,
    b: I1,
    c: I1
}

let myVar: MyInterface;

लेकिन फिर मुझे पुस्तकालय से इसे अद्यतित रखने का भार मिलता है, इसके अलावा यह बहुत बड़ा हो सकता है और कोड दोहराव के परिणामस्वरूप बहुत अधिक हो सकता है।

इसलिए, क्या इंटरफ़ेस के इस विशिष्ट संपत्ति के प्रकार को "निकालने" का कोई तरीका है? कुछ इसी तरह let myVar: typeof I2.y(जो काम नहीं करता है और "I2" त्रुटि का पता नहीं लगा सकता है)। अग्रिम में धन्यवाद।


संपादित करें : टीएस खेल के मैदान में थोड़ा खेलने के बाद मैंने देखा कि निम्नलिखित कोड वास्तव में वही हासिल करता है जो मैं चाहता हूं:

declare var x: I2;
let y: typeof x.y;

हालाँकि इसे xघोषित करने के लिए एक अनावश्यक चर की आवश्यकता होती है । मैं उस घोषणा के बिना इसे हासिल करने का रास्ता तलाश रहा हूं।


1
जो काम नहीं करता है - वह कैसे प्रकट होता है? वास्तविक त्रुटि संदेश जो आप देखते हैं?
बार्टेक बैनचेविज़

@BartekBanachewicz अपडेट
कुबा

जवाबों:


250

टाइपस्क्रिप्ट संस्करण 2.1 के बाद से यह संभव नहीं था, लेकिन सौभाग्य से यह अब है । यह 7 दिसंबर 2016 को जारी किया गया है और यह अनुक्रमणित पहुंच प्रकारों का परिचय देता है जिन्हें लुकअप प्रकार भी कहा जाता है ।

वाक्यविन्यास बिल्कुल तत्व की तरह दिखता है लेकिन प्रकारों के स्थान पर लिखा गया है। तो आपके मामले में:

interface I1 {
    x: any;
}

interface I2 {
    y: {
        a: I1,
        b: I1,
        c: I1
    }
    z: any
}

let myVar: I2['y'];  // indexed access type

अब myVarका प्रकार है I2.y

टाइपस्क्रिप्ट प्लेग्राउंड में इसे देखें ।


1
मामले में जब 'वाई' एक सरणी है, तो क्या तत्वों के प्रकार को निकालने का कोई तरीका है? जैसे I2 {y: {..} []}
जॉन B

1
@ जॉन बी हां, आप इसे बिल्कुल उसी तरह से कर सकते हैं, क्योंकि सरणी सूचक वस्तु के गुणों के समान हैं। इसे यहां देखें: टाइपस्क्रिप्टlang.org/play/…
Kuba Jagoda

3
@ जॉन बी हां, आप इसे उसी तरह एक्सेस कर सकते हैं। I2['y'][0]देखें: typescriptlang.org/play/...
मीकल Miszczyszyn

2
यह वास्तव में भयानक क्षमता है
Geradlus_RU

1
चलिए मान लेते हैं कि हम एक I2प्रकार से परिभाषित की गई वस्तु की कुंजी पर लूपिंग कर रहे हैं । लूपिंग करते समय मुझे गतिशील रूप से एक विशिष्ट कुंजी का प्रकार कैसे मिलेगा। यह; let z: typeof x[a];, जहां aएक स्ट्रिंग के रूप में एक निश्चित कुंजी है, काम नहीं करता है। यह मुझे बताता है कि aएक मूल्य को संदर्भित करता है और एक प्रकार का उल्लेख करना पड़ता है। मैं ऐसा कैसे कर पाऊंगा? क्या यह किसी भी तरह से संभव है? धन्यवाद!
एमिल वाल्ज़र

-2

एक अंतरफलक एक वस्तु की परिभाषा की तरह है। तब y आपके I2 ऑब्जेक्ट की एक संपत्ति है, जो एक निश्चित प्रकार की है, उस मामले में "अनाम"।

आप y को परिभाषित करने के लिए किसी अन्य इंटरफ़ेस का उपयोग कर सकते हैं और फिर इसे अपने y प्रकार के रूप में उपयोग कर सकते हैं

interface ytype {
   a: I1;
   b: I1;
   c: I1;
}

interface I2 {
    y: ytype;
    z: any;
}

आप अपने इंटरफ़ेस को एक फ़ाइल में रख सकते हैं और अर्क का उपयोग कर सकते हैं ताकि आप इसे अपनी परियोजनाओं की अन्य फ़ाइलों में आयात कर सकें

export interface ytype {
   a: I1;
   b: I1;
   c: I1;
}



 export interface I2 {
        y: ytype;
        z: any;
    }

आप इसे इस तरह से आयात कर सकते हैं:

   import {I1, I2, ytype} from 'your_file'

सब कुछ ठीक है, लेकिन जैसा कि मैंने उल्लेख किया है - इंटरफेस I1 और I2 एक बाहरी पुस्तकालय से आते हैं और उस पुस्तकालय के लिए d.ts फ़ाइल में परिभाषित किए गए हैं। इसलिए इस ytype इंटरफ़ेस का एक कोड दोहराव होगा और इसे लगातार अपडेट करने की आवश्यकता होगी।
कुबा जगोदा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.