2015-03-20 6 views
6

में एक विशिष्ट इंटरफ़ेस प्रकार है, क्या एक टाइपग्रार्ड बनाना संभव है, या किसी अन्य उद्देश्य को पूरा करने के लिए यह संभव है कि यह देखने के लिए कि कोई चर टाइपस्क्रिप्ट यूनियन में एक विशिष्ट इंटरफ़ेस प्रकार है या नहीं?जांचें कि क्या वैरिएबल एक टाइपस्क्रिप्ट यूनियन

interface Foo { a:string } 
interface Bar { b:string } 

(function() { 
    function doStuff(thing: Foo | Bar) { 
     if(typeof thing === 'Foo') { 
      console.log('Foo'); 
     } 
     else if (typeof thing === 'Bar') { 
      console.log('Bar'); 
     } 
     else { 
      console.log('unknown'); 
     } 
    } 

    var thing: Foo = {a:'a'}; 
    doStuff(thing); 
})(); 

उत्तर

4

typeof ऐसा नहीं करता है। यह हमेशा "स्ट्रिंग", "संख्या", "बूलियन", "ऑब्जेक्ट", "फ़ंक्शन" या "अपरिभाषित" लौटाता है।

आप if(thing.a !== undefined) { या if(thing.hasOwnProperty('a')) { जैसे परीक्षण के साथ ऑब्जेक्ट गुणों के लिए परीक्षण कर सकते हैं।

ध्यान दें कि आप एक वस्तु है कि दोनों एक स्ट्रिंग a और एक स्ट्रिंग b था कर सकता है, ताकि संभावना के बारे में पता होना।

+1

देखें तो वहाँ एक चर विशिष्ट गुणों की जाँच (जैसे बिना एक इंटरफेस के अनुरूप है, तो जाँच करने के लिए कोई रास्ता नहीं है 'एक' हमारे उदाहरण में)? – myartsev

+0

यह सही है –

2

टाइपप्रति 2 में आप Discriminated Unions इस तरह उपयोग कर सकते हैं:

interface Foo { 
    kind: "foo"; 
    a:string; 
} 
interface Bar { 
    kind: "bar"; 
    b:string; 
} 
type FooBar = Foo | Bar; 
let thing: FooBar; 

और फिर परीक्षण वस्तु if (thing.kind === "foo") का उपयोग कर।

आप केवल 2 क्षेत्रों की तरह है, तो उदाहरण में मैं शायद @ryan-cavanaugh उल्लेख किया संयुक्त इंटरफेस के साथ जाने के लिए और दोनों गुण वैकल्पिक बनाना होगा:

interface FooBar { 
    a?: string; 
    b?: string 
} 

नोट मूल उदाहरण में उपयोग कर if (thing.a !== undefined) का उत्पादन वस्तु परीक्षण है कि त्रुटि Property 'a' does not exist on type 'Foo | Bar'.

और if (thing.hasOwnProperty('a')) का उपयोग करके इसका परीक्षण if कथन के अंदर Foo को संकीर्ण नहीं करता है।

@ryan-cavanaugh क्या टाइपस्क्रिप्ट 2.0 या 2.1 में कोई बेहतर तरीका है?

+0

यूनियनों, आईएमओ, और ओपी की समस्या को संभालने का सबसे अच्छा तरीका यह है कि यह कंपाइलर चेक प्राप्त करने का सबसे सुरक्षित तरीका है। मुझे लगता है कि यह अब सबसे अच्छा जवाब है @myartsev – jocull

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