2016-02-02 17 views
6

Có thể xác định thủ công các phương thức bổ sung cho một lớp hiện có không?Flowtype: mở rộng động các lớp học

usecase cụ thể của tôi là bluebird của promisifyAll() đó:

Promisifies toàn bộ đối tượng bằng cách đi qua thuộc tính của đối tượng và tạo ra một tương đương async của mỗi chức năng trên đối tượng và chuỗi nguyên mẫu của nó ... http://bluebirdjs.com/docs/api/promise.promisifyall.html

Rõ ràng, luồng sẽ không thể tự động tìm ra điều này. Vì vậy, tôi sẵn sàng giúp đỡ. Câu hỏi là CÁCH?

Xét đoạn mã sau

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òng chảy mang đến cho các lỗi sau đây:

property `listenAsync`. Property not found in 
Server 

Sẽ không có bất kỳ lỗi nếu tôi sử dụng listen. dòng chảy đủ thông minh để thấy rằng đây là một phương pháp thực được định nghĩa trong một mô-đun. Nhưng listenAsync là một bổ sung động bởi promisifyAll và không thể nhìn thấy được

Trả lời

7

Điều đó là không thể và điều đó sẽ không thực sự an toàn để thực hiện. Dưới đây là một cái gì đó bạn có thể làm cho trường hợp của bạn:

đầu tiên khai báo bluebird như sau:

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

Sau đó làm điều này:

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) 

Ở đây chúng ta tự đúc httpPromisifiedHttp. Chúng tôi vẫn phải khai báo tất cả các loại được khuyến khích theo cách thủ công, mặc dù chúng tôi có thể sử dụng loại giao cắt để mở rộng các loại hiện có.

+0

cảm ơn. cái này không hoàn hảo, vì nó đòi hỏi sự thay đổi mã. thay đổi nhỏ, nhưng vẫn còn. và nó có nghĩa là mã sẽ phải được thay đổi cho các trường hợp động khác nữa. Tôi hiểu "sẽ không thực sự an toàn" một phần, nhưng nó không thực tế như trong cả hai trường hợp trình biên dịch không thể suy ra dữ liệu từ mã và tin tưởng tôi để viết định nghĩa chính xác. – JimiDini

+0

nói chung không thể diễn tả một số mẫu động trong luồng. Bạn phải cô lập các phần quá động từ luồng và cung cấp các khai báo thích hợp cho các phần đã nhập – vkurchatkin

+0

Nó sẽ làm giảm đường cong đáng kể nếu luồng có cơ chế làm những việc như mở rộng mẫu thử theo cách "không an toàn". Ví dụ, nếu tôi sử dụng một thư viện như should.js hoặc chai, tôi sẽ có thể tạo ra một giao diện trong libs mở rộng prototype của Object với hàm 'should'. Nếu điều này không thể thực hiện theo kiểu an toàn, cho phép người tiêu dùng vô hiệu hóa phân tích tĩnh trên các đường dẫn mã sử dụng nó thay vì ném lỗi. – cchamberlain

Các vấn đề liên quan