मान लीजिए कि मेरे पास दो इंटरफेस हैं:

interface Box {
    x: number
    y: number
}

तथा

interface ColouredBox {
    x: number
    y: number
    colour: string
}

इस प्रश्न के प्रयोजन के लिए मान लें कि मैं इंटरफेस नहीं बदल सकता।

अब वस्तुओं का निर्माण करते समय, मेरे पास इस तरह का कोड है:

let a: Box|ColouredBox = {x: 1, y: 2}
if( something ){
    a.colour = "Blue"  // Compilation Error
}

मुझे यह त्रुटि a.colour = "Blue" पर मिलती है:

Error:(24, 26) TS2339: Property 'colour' does not exist on type 'Box'.

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

1
sixtyfootersdude 4 फरवरी 2020, 01:47

2 जवाब

सबसे बढ़िया उत्तर

आंशिक का उपयोग करना

संघ प्रकार का उपयोग करने के बजाय, आप आंशिक

let a: Partial<ColouredBox> = {x: 1, y: 2}

आंशिक ColoredBox के सभी गुणों को वैकल्पिक के रूप में सेट करेगा।

लाइव उदाहरण

अपडेट करें:

इंटरफ़ेस को हटा दें

यदि आप चाहते हैं कि इंटरफ़ेस का केवल रंग वाला भाग वैकल्पिक हो, तो आप किसी एक इंटरफ़ेस को समाप्त कर सकते हैं।

interface Box {
  x: number;
  y: number;
  color?: string;
}

फिर यह निर्धारित करने के लिए कि क्या आप रंगीन बॉक्स से निपट रहे हैं:

if (box.color) { ... }

अभिकथन टाइप करें

यदि आप दोनों इंटरफेस का उपयोग करने के लिए चिपके रहते हैं, तो आप विशेष रूप से a को as कीवर्ड (a.k.a. a Type Assertion) का उपयोग करके ColouredBox के रूप में मान सकते हैं।

let a: Box | ColouredBox = { x: 1, y: 2 };
(a as ColouredBox).colour = "Blue";
1
Jason 4 फरवरी 2020, 04:36

आप inप्रकार का उपयोग कर सकते हैं गार्ड:

if ("colour" in a) {
    a.colour = "Blue"  // works
}

यह संपत्ति colour के अस्तित्व के आधार पर संघ भाग ColouredBox तक सीमित हो जाएगा। सामान्य तौर पर, आप केवल Box | ColouredBox के सभी सामान्य गुण x/y का चयन कर सकते हैं, जब पहले संकुचित नहीं किया गया हो।

लाइव कोड नमूना यहाँ

1
bela53 4 फरवरी 2020, 02:22