Typescript:基于先前数组元素的数组类型

3

在TypeScript中,是否可以实现一个无限的数组(不是元组),其类型依赖于数组前一个元素?

以下是一些伪TypeScript代码,以示例说明:

class B<T, U> {}

function foo<X, Y>(...args: [B<X, Z0>, B<Z0, Z1>, B<Z1, Z2>, ..., B<ZN, Y>]) {}

foo<string, number>(new B<string, number>, new B<number, boolean>, new B<boolean, number>); // Correct
foo<string, number>(new B<string, number, new B<number, boolean>); // Incorrect
foo<string, number>(new B<string, number>, new B<boolean, number>); // Incorrect

我应该用什么替换 "[B<X, Z0>, B<Z0, Z1>, B<Z1, Z2>, ..., B<ZN, Y>]" 才能让这个工作?这是可行的吗?

谢谢!


1
我倾向于将此问题视为此问题的重复,但这里的问题不够具体,以至于我无法确定发生了什么。您的示例B是一个未使用类型参数的空类,因此不可能有任何接受B<string, number>而拒绝B<boolean, number>的代码,因为它们是相同类型,等于{}。请考虑修改代码,以构成一个[mcve],可以将其放入独立的IDE中,以向他人演示问题。 - jcalz
1个回答

2

我最近也遇到了类似的问题。我的问题涉及创建一条长流水线。第i个流的输出必须是第i+1个流的输入等等。我是这样解决的:

type OmitFirst<T extends any[]> = T extends [any, ...infer R] ? R : never
type GetValueOrDefault<Thing, Key, Default = never> = Key extends keyof Thing ? Thing[Key] : Default
type Pipe<Start, Finish, Inputs extends [Start, ...any[]], Outputs extends any[] = OmitFirst<Inputs>> = {
    [I in keyof Inputs]: DuplexConstructor<Inputs[I], GetValueOrDefault<Outputs, I, Finish>>
}

export function pipe<F, L, P extends [F, ...any[]]>(
    ...streams: [ReadableConstructor<F>, ...Pipe<F, L, P>, WritableConstructor<L>]
): Writable {
    const source = streams[0]
    const duplexes = streams.slice(1, -1) as Pipe<F, L, P>
    const sink = streams[streams.length - 1] as WritableConstructor<L>

    let tail = readable(source)
    duplexes.forEach((dp) => (tail = tail.pipe(duplex(dp))))
    return tail.pipe(writable(sink))
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接