2016-02-02 19 views
6

Mevcut bir sınıf için ek yöntemleri manuel olarak tanımlamak mümkün mü?Flowtype: dinamik olarak uzanan sınıflar

Benim spesifik usecase olan mavi kuş en promisifyAll() hangi:

Promisifies nesnenin özelliklerini geçmekte ve nesne ve prototip zincirinde her fonksiyonun bir zaman uyumsuz eşdeğer oluşturarak tüm nesneyi ... http://bluebirdjs.com/docs/api/promise.promisifyall.html

Açıkçası, akış bunu otomatik olarak çözemeyecekti. Yani, yardım etmeye hazırım. Soru NASIL? Ben listen kullanılırsa

property `listenAsync`. Property not found in 
Server 

herhangi bir hata söz konusu olmaz:

Akış burada aşağıdaki hatayı veriyor aşağıdaki kodu

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') 
}) 

düşünün. akış, bunun bir modülde tanımlanan gerçek bir yöntem olduğunu görecek kadar akıllıdır. Ancak listenAsync, promisifyAll tarafından dinamik bir eklentidir ve

cevap

7

akışının görünmesi mümkün değildir ve bu gerçekten güvenli olmaz.

ilk beyan bluebird aşağıdaki gibidir::

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

Sonra bunu: Burada

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) 

manuel PromisifiedHttp yazmanız http döküm Burada durum için yapabileceği bir şeydir. Var olan türleri genişletmek için tip kesişimini kullanabilsek de, tüm promisifed türleri manuel olarak bildirmek zorundayız.

+0

teşekkürler. Bu kod değişikliği gerektirdiğinden, mükemmel değildir. küçük değişiklik, ama yine de. ve diğer dinamik durumlar için kodun da değiştirilmesi gerektiği anlamına gelir. "Gerçekten güvende olmaz" bölümünü anlıyorum, ancak her iki durumda da derleyici koddan veri çıkarıp doğru tanımı yazmam için bana güvenir. – JimiDini

+0

genel olarak akıştaki bazı dinamik modelleri ifade etmek mümkün değildir. Akıştan çok fazla dinamik parça ayırmak ve yazılan parçalar için uygun beyanlar vermek zorundasınız. – vkurchatkin

+0

Akış, prototip uzantısı gibi şeyleri "güvenli olmayan" bir şekilde yapmak için bir mekanizmaya sahip olsaydı, eğriyi önemli ölçüde azaltacaktır. Mesela, should.js veya chai gibi bir kütüphane kullanırsam, lib'lerde Object'in prototipini 'should' fonksiyonuyla genişleten bir arayüz oluşturabilmem gerekir. Bu güvenli bir şekilde yapılamazsa, tüketicinin hataları atmak yerine onu kullanan kod yollarındaki statik analizi devre dışı bırakmasına izin verin. – cchamberlain