मैं टाइपप्रति में किसी भी प्रकार के बजाय कई प्रकारों में से एक के रूप में पैरामीटर प्रकार निर्दिष्ट कर सकते हैं?

वोट
9

टाइपप्रति में एक विधि घोषणा में, पैरामीटर तार, बूलियन्स, या संख्याओं के प्रकार के सरणी के हो सकता है। मैं के रूप में किसी भी [] यह घोषणा करने के लिए है या इन तीन प्रकार के पर के रूप में इनपुट प्रकार सीमित करने के लिए एक तरह से है?

08/10/2012 को 07:50
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


6 जवाब

वोट
25

टाइपप्रति 1.4 शुरू की संघ प्रकार तो इस सवाल का जवाब अब है हाँ, आप कर सकते हैं

function myFunc(param: string[] | boolean[] | number[]): void;

निर्दिष्ट एक संकलन समय त्रुटि ट्रिगर करेंगे लोगों के अलावा अन्य प्रकार का उपयोग करना।


आप एक से अधिक विशिष्ट प्रकार की एक सरणी चाहते हैं, आप उस के लिए संघ के प्रकार के साथ-साथ उपयोग कर सकते हैं:

function myFunc(param: (string|boolean|number)[]): void;

ध्यान दें कि यह क्या ओ पी के लिए कहा से अलग है। ये दो उदाहरण अलग अलग अर्थ है।

28/08/2015 को 05:21
का स्रोत उपयोगकर्ता

वोट
7

इसमें कुछ समय पुराने सवाल लगता है, लेकिन वैसे भी, मैं इसे भर में आया था, और यह अन्य जवाब है कि मैं लाने याद किया।

टाइपप्रति 1.4 से लगता है कि वह इस तरह का समारोह पैरामीटर के लिए कई संभव प्रकार की घोषणा करने के लिए संभव है:

class UtilsClass {
    selectDom(element: string | HTMLElement):Array<HTMLElement> {
        //Here will come the "magic-logic"
    }
}

इसका कारण यह है "संघ-प्रकार" के नए टाइपप्रति अवधारणा के है।

आप अधिक देख सकते हैं यहां

14/05/2015 को 09:56
का स्रोत उपयोगकर्ता

वोट
1

सं टाइपप्रति एक पैरामीटर में केवल एक ही वैकल्पिक TypeAnnotation, जैसे का समर्थन करता है x: stringतो आप की अनुमति दी प्रकार का एक सेट राज्य नहीं कर सकते,, संख्या या किसी।

हालांकि, टाइपप्रति समारोह भार के (प्रलेखन p51) का समर्थन करता है:

समारोह भार के एक समारोह के द्वारा समर्थित मंगलाचरण के पैटर्न की एक अधिक सटीक विनिर्देश की तुलना में एक भी हस्ताक्षर के साथ संभव है अनुमति देते हैं। [...]

    function attr(name: string): string;
    function attr(name: string, value: string): Accessor;
    function attr(map: any): Accessor;
    function attr(nameOrMap: any, value: string): any {
        if (nameOrMap && typeof nameOrMap === "object") {
            // handle map case
        }
        else {
            // handle string case
        }
    }

Otherwsie आप उपयोग कर सकते हैं typeofप्रकार की जाँच करता है, लेकिन इस के प्रकार ascpect काउंटरों प्रकार स्क्रिप्ट एक छोटा सा।

function myFunc(x){
    if(typeof x !== "string" && typeof x !== "object" && typeof x !== "number")
        throw new TypeError("Unsupported type!");
}
08/10/2012 को 08:08
का स्रोत उपयोगकर्ता

वोट
1

ऐसा करने के लिए समारोह भार के उपयोग कर सकते हैं:

class Thing {
    public foo(x: number[]);
    public foo(x: bool[]);
    public foo(x: string[]);
    public foo(x: any[]) {
       // Note: You'll have to do type checking on 'x' manually
       // here if you want differing behavior based on type
    }
}

// Later...
var t = new Thing();
t.foo(someArray); // Note: External callers will not see the any[] signature
08/10/2012 को 08:07
का स्रोत उपयोगकर्ता

वोट
0

इसके समाधान के लिए एक अन्य तरीका इनपुट प्रकार के बीच आम तरीकों और गुण को खोजने और विधि घोषणा कि इन आम methos और गुण रखती में एक इन-लाइन प्रकार की घोषणा करने के लिए है। इस कदर:

methodName(param1: { prop1: number; prop2: string; }, param2: { propA: bool; propB: string; } ): methodResultType;
08/10/2012 को 08:21
का स्रोत उपयोगकर्ता

वोट
0

के बाद से तार, बूलियन्स और संख्या आदिम प्रकार के होते हैं मुझे नहीं लगता कि एक आसान तरीका है। आप अलग अलग वस्तु प्रकार का एक सेट का प्रयोग करेंगे, तो आप शायद एक सुपर वर्ग के साथ आ सकता है और फिर अपने विधि के इंटरफेस में है कि सुपर वर्ग निर्दिष्ट करें। दूसरी ओर, तुम भी तार, बूलियन्स और पूर्णांकों का सरणियों के लिए अलग कार्यान्वयन निर्दिष्ट करने के लिए विधि ओवरलोडिंग इस्तेमाल कर सकते हैं।

08/10/2012 को 08:08
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more