2017-04-18 19 views
6

Tôi đang cố gắng sử dụng rxjs 5 để viết máy chủ Node.js trong TypeScript, nhưng tôi đã gặp lỗi khi chuyển đổi fs.readFile thành dạng rxjs của nó. Tôi hy vọng các mã sau đây có thể làm việc trong nguyên cảoKhông thể tạo quan sát được từ Observable.bindNodeCallback (fs.readFile) trong TypeScript

// This is a JavaScript example from the official documentation. It should 
// also work at the TypeScript envrionment. 

import * as fs from 'fs'; 
import { Observable } from 'rxjs'; 

let readFileAsObservable = Observable.bindNodeCallback(fs.readFile); 

// This is the line that throws the error. 
let result = readFileAsObservable('./roadNames.txt', 'utf8'); 

result.subscribe(x => console.log(x), e => console.error(e)); 

Tuy nhiên, biên tập viên của tôi báo cáo một lỗi đánh máy khi tôi thêm tham số thứ hai 'utf-8'

Supplied parameters do not match any signature of call target. 

tôi cố gắng để tìm một hướng dẫn về cách sử dụng các fs.readFile() trong rxjs và TypeScript nhưng không có nhiều may mắn.

Trả lời

9

bindCallbackbindNodeCallback có thể phức tạp với TypeScript, vì tất cả đều phụ thuộc vào cách TypeScript nhập tham số chức năng.

Có thể là một cách tốt hơn, nhưng đây là những gì tôi làm để xem chính xác suy luận của bạn: gán cho một cái gì đó hoàn toàn không tương thích và nhìn kỹ vào lỗi thực hiện. Ví dụ, điều này:

const n: number = Observable.bindNodeCallback(fs.readFile); 

sẽ ảnh hưởng đến lỗi này:

Type '(v1: string) => Observable<Buffer>' is not assignable to type 'number'. 

Vì vậy, rõ ràng là nguyên cảo là phù hợp với tình trạng quá tải đường chỉ của readFile.

Trong các trường hợp như thế này, tôi thường sử dụng chức năng mũi tên để chỉ định chính xác tình trạng quá tải mà tôi muốn sử dụng. Ví dụ, điều này:

const n: number = Observable.bindNodeCallback((
    path: string, 
    encoding: string, 
    callback: (error: Error, buffer: Buffer) => void 
) => fs.readFile(path, encoding, callback)); 

sẽ ảnh hưởng đến lỗi này:

Type '(v1: string, v2: string) => Observable<Buffer>' is not assignable to type 'number'. 

Vì vậy, nó hiện phù hợp với tình trạng quá tải mong muốn và sau đây sẽ làm việc:

let readFileAsObservable = Observable.bindNodeCallback((
    path: string, 
    encoding: string, 
    callback: (error: Error, buffer: Buffer) => void 
) => fs.readFile(path, encoding, callback)); 

let result = readFileAsObservable('./package.json', 'utf8'); 
result.subscribe(
    buffer => console.log(buffer.toString()), 
    error => console.error(error) 
); 
+0

Cách tốt nhất để thực thi quá tải hàm. Cảm ơn! –

+0

Tôi có nên xem xét điều này là kết quả của bản chất của TypeScript (chắc chắn đã nhập), hoặc một lỗ hổng thiết kế của rxjs? –

+1

Theo quan điểm của tôi, nó không phải là một lỗi thiết kế. Nếu chức năng có quá tải, không có cách nào nó có thể đoán được cái nào bạn muốn. Tôi nghĩ TypeScript thực hiện một công việc khá tốt để suy ra các kiểu tham số. Lợi ích khác của việc sử dụng chức năng mũi tên là bạn có thể tránh sử dụng 'bind' khi phương thức cần được gọi trên một ngữ cảnh cụ thể. 'bind' trả về' bất kỳ' và sau đó các tham chiếu TypeScript là tốt và thực sự gây rối. – cartant

1

Thành thật mà nói tôi thiên đường' t tìm thấy một giải pháp, nhưng để làm cho nó hoạt động, tôi đưa nó vào một hàm.

(<Function>Rx.Observable.bindNodeCallback(fs.readFile))('./file.txt', 'utf8').subscribe(); 
Các vấn đề liên quan