【问题标题】:Typescript: Array type depending on previous array element打字稿:数组类型取决于先前的数组元素
【发布时间】:2021-03-30 01:30:09
【问题描述】:

是否可以在 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&lt;X, Z0&gt;, B&lt;Z0, Z1&gt;, B&lt;Z1, Z2&gt;, ..., B&lt;ZN, Y&gt;]”才能完成这项工作?这甚至可能吗?

谢谢!

【问题讨论】:

  • 我倾向于将其作为this question 的副本关闭,但这里的问题不够具体,我无法说出发生了什么。您的示例B 是一个带有未使用类型参数的空类,因此不可能有任何接受的代码。比如B&lt;string, number&gt;,同时拒绝B&lt;boolean, number&gt;,因为它们是等于{}的相同类型。 `.请考虑修改代码以构成minimal reproducible example,可以将其放入独立的IDE中向其他人展示问题。

标签: arrays typescript generics types


【解决方案1】:

我最近遇到了类似的问题。我的问题涉及创建一长串流。流 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))
}

【讨论】:

    猜你喜欢
    • 2021-12-04
    • 2019-03-22
    • 2016-07-29
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2017-02-20
    • 1970-01-01
    相关资源
    最近更新 更多