2017-12-24 98 views
10

Tôi đang cố gắng viết một dự án Javascript với việc nhập dòng chảy nghiêm ngặt ở mọi nơi. Tôi cũng có một sự phụ thuộc vào big-integer. Không có chú thích luồng được đặt trước nào trong số flow-typed không may và Google không cung cấp bất kỳ điều gì hữu ích về chủ đề này.Làm thế nào để khai báo kiểu dòng cho một hàm có trường?

Giống như nhiều gói JavaScript, big-integer xuất một hàm duy nhất, thường được gọi là bigInt. Điều này có thể được gọi trực tiếp, như vậy: bigInt(13), bigInt("134e134"), v.v., tạo đối tượng là số nguyên lớn (tôi đã quyết định gọi loại giá trị trả về của hàm này là "lớp" được gọi là "BigInteger" dựa trên tài liệu - nhưng tôi không nghĩ rằng các internals thực sự sử dụng các lớp vì tôi tin rằng gói đã xuất hiện trước ES6).

Điều này làm việc tốt cho đầu ra của hàm và tôi có thể đính kèm các phương thức cho lớp đó và tất cả chúng ta đều tốt. Tuy nhiên, bigInt chính nó có một số phương pháp, ví dụ: bigInt.lcm(123, 234). Làm thế nào tôi có thể ghi lại điều này?

declare module "big-integer-types" { 
    declare class BigInteger { 
    add(addend: BigIntInput): BigInteger; 
    minus(subtractand: BigIntInput): BigInteger; 
    /* snip */ 
    } 
    declare type BigIntInput = number | string | BigInteger; 
    declare type BigIntFn = (void | number | string | BigInteger) => BigInteger; 
} 

declare module "big-integer" { 
    import type { BigIntFn } from "big-integer-types"; 
    declare export default BigIntFn 
} 

Điều này phù hợp với các trường của số nguyên lớn, ví dụ: để kiểm tra loại bigInt(12).plus("144e53"). Điều đó thật tuyệt. Nhưng điều này không bao gồm bigInt.lcm(134, 1551) và điều đó gây ra lỗi dòng chảy.

Cách khác là tuyên bố xuất mô-đun big-integer thành loại loại có chức năng liên quan nhất định. Ví dụ:

declare module "big-integer-types" { 
    declare type BigIntegerStaticMethods { 
    lcm(a: BigIntInput, b: BigIntInput): BigInteger, 
    /* snip */ 
    } 

    declare type BigIntInput = number | string | BigInteger; 
} 

declare module "big-integer" { 
    import type BigIntegerStaticMethods from "big-integer-types"; 
    declare export default BigIntegerStaticMethods 
} 

này hoạt động cho các phương pháp tĩnh, nhưng tôi không biết làm thế nào để nói một "loại" có thể gọi. Vì vậy, tôi thua lỗ như thế nào để đạt được cả hai cùng một lúc. Điều này có vẻ lạ vì một hàm với các trường khá phổ biến trong javascript và tài liệu luồng cho thấy chúng đã trải qua rất nhiều nỗ lực để có hỗ trợ hệ thống kiểu javascript vì nó được sử dụng. Vì vậy, tôi tìm thấy có một cú pháp dòng chảy để đạt được điều này, tôi chỉ không thể tìm ra nó là gì, và không thể tìm thấy nó trong tài liệu.

Trả lời

4

Bạn có thể khai báo một hàm tĩnh giấu tên trong lớp:

declare type BigIntInput = number | string | BigInteger; 
declare class BigInteger { 
    add(addend: BigIntInput): BigInteger; 
    minus(subtractand: BigIntInput): BigInteger; 

    static lcm(a: BigIntInput, b: BigIntInput): BigInteger; 
    static (data?: BigIntInput): BigInteger; 
} 

BigInteger.lcm(1,2); 
BigInteger(4).add(5); 
+0

Tôi không chắc chắn lý do tại sao câu trả lời này đang thu hút rất nhiều upvotes. Nó không hoạt động. Hàm tĩnh chưa được đặt tên không được nhận dạng bởi luồng và gây ra lỗi luồng. –

+0

Bạn có thể giải thích về lỗi này không? Mã này không thất bại cho tôi tại [Flow/Try] (https://flow.org/try/), đó cũng là những gì chúng tôi sử dụng tại codebase của chúng tôi cho các tình huống như vậy. – user3707125

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