Trong bảng chữ, cách xác định loại hàm không đồng bộ


84

Tôi đã cố gắng xác định một loại hàm không đồng bộ, nhưng không thành công trong quá trình biên dịch, hãy xem bên dưới:

interface SearchFn {
    async (subString: string): string;
}

class A {
    private Fn: SearchFn
    public async do():Promise<string> {
        await this.Fn("fds") // complain here: cannot invoke an expression whose type lacks a call signature
        return ''
    }
}

Bất cứ ai có thể giúp tôi giải quyết vấn đề này?


Promise <boolean> không hoạt động?
— toskv

Vui lòng cho biết cách / nơi bạn đang xác định Fn.

Câu trả lời:


156

Tìm thấy điều này đang tìm kiếm cách khai báo "typedef" cho một hàm mũi tên không đồng bộ.

Nó hoạt động nếu bạn chỉ khai báo kiểu trả về của hàm là Promise:

interface SearchFn {
    (subString: string): Promise<boolean>;
}

hoặc như một khai báo kiểu:

type SearchFn = (subString: string) => Promise<boolean>;

TS Linter của Microsoft sẽ giới thiệu cú pháp thứ hai này.


3
Thông minh, cảm ơn bạn, async func thực sự là một chức năng trả về Promise.
— Ron

@Ron đáng nói là không đúng, hàm async chỉ đơn giản là sử dụng await. Xem câu trả lời của Motti
— Code Novitiate

Mọi người nên lưu ý rằng một hàm trả về một lời hứa không nhất thiết phải là một hàm không đồng bộ.
— liaguridio

1
nếu không có giá trị trả lại thì sao? ): Promise<undefined>đang thất bại đối với tôi. Tôi chỉ cần một hàm không đồng bộ để tôi có thể sử dụng awaitbên trong nó ...
— dcsan

2
@dcsan Lời hứa <void>
— Thiago Barcala

21

Các asynctừ khóa được sử dụng để báo cho trình biên dịch / runtime rằng chức năng trong câu hỏi sẽ sử dụng awaitnội bộ (vì vậy nó có thể đưa vào cần giàn giáo để kích hoạt nó ).

Điều này có nghĩa là nó asyncchỉ có ý nghĩa đối với việc thực hiện chức năng, không phải giao diện của nó . Do đó, việc asyncsử dụng phương thức của một giao diện là không hữu ích, bạn muốn nói rằng hàm trả về một hàm nhất định Promise(trong trường hợp của bạn Promise<string>) nhưng bạn không muốn bắt buộc người triển khai giao diện thực hiện điều này theo một cách nhất định (sử dụng await).

Vì vậy, như người khác đã nói trước tôi:

interface SearchFn {
    (subString: string): Promise<string>;
}

Sau đó, bất kỳ ai chọn triển khai chức năng này đều có thể chọn sử dụng async, Promise.thenphương pháp luận cũ hoặc thậm chí có thể là một số phương pháp luận mới sẽ xuất hiện trong tương lai.


1
Câu trả lời tuyệt vời và giải thích "tại sao" một cách ngắn gọn.
— Code Novitiate

7

Chuyển kiểu của đối tượng trả về cho chung Promise.

type SearchFn = (subString: string): Promise<string>;

Ngoài ra, bạn có thể khai báo một AsyncFunctionkiểu chung.

type AsyncFunction <A,O> = (...args:A) => Promise<O> 
type SearchFn = AsyncFunction<[string], string>

AsyncFunction là một kiểu chung nhận hai biến kiểu - kiểu của đầu vào (A) và kiểu của đầu ra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.