为何在Flow泛型中需用number[][]而非number[]作为输入类型?
为什么flow的泛型参数需要用二维数组类型?
先明确你的调用场景:
flow( map(item => item.toString()) )([1, 2, 3])
再结合flow的类型定义来看:
export declare function flow<A extends ReadonlyArray<unknown>, B>(ab: (...a: A) => B): (...a: A) => B
核心原因在于泛型参数A的定位:它代表的是flow返回的函数接收的所有参数组成的数组,而非单个参数的类型。
当你调用flow(...)返回的函数时,只传入了一个参数[1,2,3](类型为number[]),此时这个函数的rest参数会把这一个参数打包成一个数组,也就是[number[]]——而[number[]]属于number[][]的子类型(元组是数组的特殊形式)。
你最初写的flow<number[], string[]>之所以报错,是因为这相当于告诉TypeScript:flow返回的函数接收的是多个number类型的零散参数(rest参数展开后对应number[]),但实际你传入的是一个number[]类型的单个参数,类型完全不匹配。
而flow<number[][], string[]>能通过校验,是因为number[][]匹配了「单个number[]参数组成的数组」这个类型([number[]]符合A extends ReadonlyArray<unknown>的约束)。如果想更精准表达「只接收一个number[]类型参数」的意图,也可以用元组类型flow<[number[]], string[]>,效果和number[][]一致。
内容的提问来源于stack exchange,提问作者elzoy
相关产品推荐
相关产品推荐

