Recursion 递归展平函数的TypeScript签名

Recursion 递归展平函数的TypeScript签名,recursion,typescript,Recursion,Typescript,我正在为reactivecoffee()构建一个Typescript.ds文件,但我在试图找出flatten函数的类型签名时遇到了麻烦。例如: 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)])])]) /

我正在为reactivecoffee()构建一个Typescript.ds文件,但我在试图找出
flatten
函数的类型签名时遇到了麻烦。例如:

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的正确Typescript类型签名是什么?到目前为止,我已经想出了这样的办法:

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>
interface NestableCell扩展ObsCellInterface{}
类型可展平=(
排列|
obserrayinterface
)
函数展平(xs:flatteable)=>obsarayinterface
ObsCellInterface
obsarayinterface
分别是RC的
ObsCell
obsaray
对象的类型化版本


不幸的是,Typescript不允许递归类型,只允许递归接口。在这一点上,我真的不知道如何将该类型转换为接口。

以下内容似乎有效,尽管我还没有时间证明它满足所有可能的情况:

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>
接口NestableCell扩展ObsCell{}
接口平坦化扩展OBS阵列<
T|
嵌套细胞|
可展JS|
平坦的
> {}
接口扩展数组<
T|
嵌套细胞|
可展JS|
平坦的
> {}
导出类型可展平=可展平Rx |可展平JS
使用两个相互递归的接口似乎可以避免由于同时支持原始数组和反应数组而带来的最严重的复杂性

正如我所说的,我还不能证明这是可行的,但至少看起来是合理的