2017-12-24 101 views
10

Her yerde sıkı akışlı bir Javascript projesi yazmaya çalışıyorum. Ayrıca big-integer'da bir bağımlılığım var. Maalesef flow-typed numaralı telefonda önceden ayarlanmış akış ek açıklaması yok ve Google konuyla ilgili yararlı hiçbir şey sunmuyor.Alanları olan bir işlev için Akış türleri nasıl bildirilir?

Birçok JavaScript paketi gibi, big-integer genellikle bigInt olarak adlandırılan tek bir işlevi verir. Bu, doğrudan gibi çağrılabilir: bigInt(13), bigInt("134e134"), vb, büyük tamsayılar olan nesneler oluşturur (bu işlevin dönüş değeri türünü "BigInteger" adlı bir "sınıf" olarak adlandırmaya karar verdim) Belgeleme - ama paketin ES6'dan önce ortaya çıktığına inandığım için internals gerçekten dersleri kullanıyor sanmıyorum).

Bu, işlevin çıktısı için iyi çalışıyor ve bu sınıfa yöntem ekleyebiliyorum ve hepimiz iyiyiz. Bununla birlikte, bigInt'un kendi kendine ait bazı yöntemleri vardır, örn. bigInt.lcm(123, 234). Bunu nasıl belgeleyebilirim?

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 
} 

Bu alanlar büyük tamsayılar örn için iyi çalışır bigInt(12).plus("144e53") tip kontrolü için. Hangisi harika. Ancak bu, bigInt.lcm(134, 1551)'u içermez ve bu bir akış hatası verir. Alternatif, big-integer modülünün dışa aktarma işlevinin belirli ilişkili işlevleri olan tip olması gerektiğini bildirmektir. Örneğin:

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 
} 

Bu statik yöntemler için çalışır, ama "türü" nasıl denir bilmiyorum denilen olabilir. Bu yüzden, her ikisine de nasıl ulaşılacağı konusunda bir kayıp yapıyorum.

Bu durum garip görünüyor çünkü alanlara sahip bir işlev javascript'te oldukça yaygındır ve akış belgeleri, kullanılan tip sistemi destek javascript 'a sahip olmak için çok çaba sarfettiklerini göstermektedir. Bu yüzden bunu başarmak için bir akış sözdizimi olduğunu anladım, ne olduğunu anlayamadım ve dokümanlar içinde bulamadım.

cevap

4

Sınıftaki isimsiz statik işlev bildirebilirsiniz: Bu yanıt çok upvotes çekiyor neden

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

emin değilim. İşe yaramıyor. Adsız statik işlev akış tarafından tanınmaz ve bir akış hatasına neden olur. –

+0

Hata hakkında ayrıntılı bilgi verebilir misiniz? Bu kod, benim için [Akış/Deneme] (https://flow.org/try/) adresinde başarısız olmaz, aynı zamanda bu tür durumlar için kod tabanımızda kullanırız. – user3707125

İlgili konular