2016-02-02 22 views
6

क्या मौजूदा कक्षा के लिए अतिरिक्त विधियों को मैन्युअल रूप से परिभाषित करना संभव है?फ़्लोटाइप: गतिशील रूप से कक्षाएं

मेरे विशिष्ट USECASE है Bluebird के promisifyAll() जो:

Promisifies ऑब्जेक्ट के गुणों के माध्यम से जा रहा है और वस्तु और अपने प्रोटोटाइप श्रृंखला पर प्रत्येक कार्य का एक async बराबर बनाने के द्वारा संपूर्ण वस्तु ... http://bluebirdjs.com/docs/api/promise.promisifyall.html

जाहिर है, प्रवाह स्वचालित रूप से इसे समझने में सक्षम नहीं होगा। तो, मैं इसे मदद करने के लिए तैयार हूँ। सवाल यह है कि कैसे?

निम्नलिखित कोड पर विचार करें

import http from 'http' 
import { promisifyAll } from 'bluebird' 

promisifyAll(http) 

const server = http.createServer(() => { console.log('request is in'); }) 
server.listenAsync(8080).then(() => { 
    console.log('Server is ready to handle connections') 
}) 

प्रवाह निम्न त्रुटि यहाँ देता है:

property `listenAsync`. Property not found in 
Server 

अगर मैं listen इस्तेमाल किया कोई त्रुटि नहीं होगा। फ्लो का स्मार्ट यह देखने के लिए पर्याप्त है कि यह मॉड्यूल में परिभाषित एक वास्तविक विधि है। लेकिन listenAsyncpromisifyAll द्वारा गतिशील जोड़ है और प्रवाह

उत्तर

7

यह संभव नहीं है और यह वास्तव में सुरक्षित नहीं होगा।

पहले घोषित bluebird निम्नलिखित के रूप में:

declare module "bluebird" { 
    declare function promisifyAll(arg: any): any 
} 

तो ऐसा करते हैं:

import httpNode from 'http' 
import { promisifyAll } from 'bluebird' 
import type { Server } from 'http' 


type PromisifiedServer = Server & { 
    listenAsync(port: number, hostname?: string, backlog?: number): Promise<PromisifiedServer>; 
}; 

type PromisifiedHttp = { 
    createServer(listener: Function): PromisifiedServer; 
}; 

const http: PromisifiedHttp = promisifyAll(httpNode) 

यहाँ हम मैन्युअल http डाली टाइप करने के लिए PromisifiedHttp यहाँ कुछ आप अपने मामले के लिए कर सकते हैं। हमें अभी भी सभी promisifed प्रकारों को मैन्युअल रूप से घोषित करना है, हालांकि हम मौजूदा प्रकारों को विस्तारित करने के लिए प्रकार चौराहे का उपयोग कर सकते हैं।

+0

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

+0

प्रवाह में कुछ गतिशील पैटर्न व्यक्त करना संभव नहीं है। आपको प्रवाह से बहुत गतिशील हिस्सों को अलग करना होगा और टाइप किए गए हिस्सों के लिए उचित घोषणाएं प्रदान करनी होंगी – vkurchatkin

+0

यदि प्रवाह में "असुरक्षित" तरीके से प्रोटोटाइप एक्सटेंशन जैसी चीजों को करने के लिए तंत्र था तो यह वक्र को नाटकीय रूप से कम कर देगा। उदाहरण के लिए, यदि मैं should.js या chai जैसी लाइब्रेरी का उपयोग करता हूं, तो मुझे libs में एक इंटरफ़ेस बनाने में सक्षम होना चाहिए जो ऑब्जेक्ट के प्रोटोटाइप को 'चाहिए' फ़ंक्शन के साथ बढ़ाता है। यदि यह एक प्रकार से सुरक्षित तरीके से नहीं किया जा सका, तो उपभोक्ता को उन कोड पथों पर स्थिर विश्लेषण अक्षम करने दें जो त्रुटियों को फेंकने के बजाए इसका उपयोग करते हैं। – cchamberlain

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