arrays - 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>]
”来完成这项工作?这甚至可能吗?
谢谢!
解决方案
我最近遇到了类似的问题。我的问题涉及创建一长串流。流 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))
}
推荐阅读
- php - 如何从 laravel 刀片页面的存储文件夹中下载文件?
- ruby-on-rails - 在同一应用程序中进行 POST 时的真实性令牌无效
- xsd - OneLogin php saml - SAML 响应问题
- angular - Angular:获取DIV的子元素
- object-detection - 为 TensorFlow/Keras 创建对象检测数据集
- android - 如何确定移动设备上的设备屏幕刷新开始/停止
- python-3.x - 用逗号分割文本并追加行 pandas
- java - 在旋转手机上维护搜索视图的结果
- rust - 如何修复 Rust 中的资源暂时不可用错误?
- c - Determine the minimum number of coins required for giving a change using greedy approach