2016-10-24 12 views
3

反応コーヒー(http://yang.github.io/reactive-coffee/api.html)用のTypescript .dsファイルの作成に取り組んでいますが、flatten関数の型シグニチャを調べようとしています。例:再帰的なFlatten関数のTypeScriptシグニチャ

flatten(rx.array([1, [2, 3], rx.cell(4), rx.array([rx.cell([5, rx.cell(6)])])])) 
// -> [1,2,3,4,5,6] 
flatten([1, [2, 3], rx.cell(4), rx.array([rx.cell([5, rx.cell(6)])])]) 
// -> [1,2,3,4,5,6] 

私はとのトラブルに実行している問題は、XSの正しい活字体の型シグネチャは何ですか?これまでのところ、私はこのようなものを作ってみた:

interface NestableCell<T> extends ObsCellInterface<T | NestableCell<T>> {} 

type Flattenable<T> = (
    Array<T| NestableCell<T | Flattenable<T>> | Flattenable<T>> | 
    ObsArrayInterface<T | NestableCell<T | Flattenable<T>> | Flattenable<T>> 
) 

function flatten<T>(xs:Flattenable<T>) => ObsArrayInterface<T> 

ObsCellInterfaceObsArrayInterfaceはそれぞれ、RCのObsCellObsArrayオブジェクトのバージョンを入力しています。

残念ながら、Typescriptは再帰型のみを許可し、再帰的なインターフェイスは許可しません。そして、現時点では、そのタイプをどのようにインタフェースに変換するのか本当に分かりません。

答えて

1

私はまだそれが可能なすべてのケースを満たすことを証明する時間がなかったのに、次は、動作しているようです:二つの相互再帰的なインターフェースを使用して

interface NestableCell<T> extends ObsCell<T | NestableCell<T>> {} 

interface FlattenableRX<T> extends ObsArray< 
    T | 
    NestableCell<T | FlattenableJS<T> | FlattenableRX<T>> | 
    FlattenableJS<T> | 
    FlattenableRX<T> 
> {} 

interface FlattenableJS<T> extends Array< 
    T | 
    NestableCell<T | FlattenableJS<T> | FlattenableRX<T>> | 
    FlattenableJS<T> | 
    FlattenableRX<T> 
> {} 

export type Flattenable<T> = FlattenableRX<T> | FlattenableJS<T> 

は両方をサポートすることから、最悪の合併症を避けるために表示されますプリミティブアレイとリアクティブアレイです。

私が言ったように、私はまだこれが機能することを証明することはできませんが、少なくともそれは妥当と思われます。