टाइपप्रति में एक विधि घोषणा में, पैरामीटर तार, बूलियन्स, या संख्याओं के प्रकार के सरणी के हो सकता है। मैं के रूप में किसी भी [] यह घोषणा करने के लिए है या इन तीन प्रकार के पर के रूप में इनपुट प्रकार सीमित करने के लिए एक तरह से है?
मैं टाइपप्रति में किसी भी प्रकार के बजाय कई प्रकारों में से एक के रूप में पैरामीटर प्रकार निर्दिष्ट कर सकते हैं?
टाइपप्रति 1.4 शुरू की संघ प्रकार तो इस सवाल का जवाब अब है हाँ, आप कर सकते हैं ।
function myFunc(param: string[] | boolean[] | number[]): void;
निर्दिष्ट एक संकलन समय त्रुटि ट्रिगर करेंगे लोगों के अलावा अन्य प्रकार का उपयोग करना।
आप एक से अधिक विशिष्ट प्रकार की एक सरणी चाहते हैं, आप उस के लिए संघ के प्रकार के साथ-साथ उपयोग कर सकते हैं:
function myFunc(param: (string|boolean|number)[]): void;
ध्यान दें कि यह क्या ओ पी के लिए कहा से अलग है। ये दो उदाहरण अलग अलग अर्थ है।
इसमें कुछ समय पुराने सवाल लगता है, लेकिन वैसे भी, मैं इसे भर में आया था, और यह अन्य जवाब है कि मैं लाने याद किया।
टाइपप्रति 1.4 से लगता है कि वह इस तरह का समारोह पैरामीटर के लिए कई संभव प्रकार की घोषणा करने के लिए संभव है:
class UtilsClass {
selectDom(element: string | HTMLElement):Array<HTMLElement> {
//Here will come the "magic-logic"
}
}
इसका कारण यह है "संघ-प्रकार" के नए टाइपप्रति अवधारणा के है।
आप अधिक देख सकते हैं यहां ।
सं टाइपप्रति एक पैरामीटर में केवल एक ही वैकल्पिक 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!");
}
ऐसा करने के लिए समारोह भार के उपयोग कर सकते हैं:
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
इसके समाधान के लिए एक अन्य तरीका इनपुट प्रकार के बीच आम तरीकों और गुण को खोजने और विधि घोषणा कि इन आम methos और गुण रखती में एक इन-लाइन प्रकार की घोषणा करने के लिए है। इस कदर:
methodName(param1: { prop1: number; prop2: string; }, param2: { propA: bool; propB: string; } ): methodResultType;
के बाद से तार, बूलियन्स और संख्या आदिम प्रकार के होते हैं मुझे नहीं लगता कि एक आसान तरीका है। आप अलग अलग वस्तु प्रकार का एक सेट का प्रयोग करेंगे, तो आप शायद एक सुपर वर्ग के साथ आ सकता है और फिर अपने विधि के इंटरफेस में है कि सुपर वर्ग निर्दिष्ट करें। दूसरी ओर, तुम भी तार, बूलियन्स और पूर्णांकों का सरणियों के लिए अलग कार्यान्वयन निर्दिष्ट करने के लिए विधि ओवरलोडिंग इस्तेमाल कर सकते हैं।













