我正在为reactive-coffee(http://yang.github.io/reactive-coffee/api.html)构建一个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>
ObsCellInterface
和ObsArrayInterface
分别是RC的ObsCell
和ObsArray
对象的类型版本。
不幸的是,Typescript不允许递归类型,只允许递归接口。在这一点上,我真的不确定如何将该类型转换为接口。
答案 0 :(得分: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>
使用两个相互递归的接口似乎可以避免必须同时支持原始和反应数组的最严重的复杂性。
正如我所说,我还不能证明这是有效的,但至少看起来似乎是合理的。