基于我测试过的Higher order function type inference中的示例,TS如何解析pipe
函数中的函数组合类型。 pipe
:
declare function pipe<A extends any[], B, C>(
ab: (...args: A) => B, bc: (b: B) => C): (...args: A) => C;
这些是传递给管道的函数:
declare function list<T>(a: T): T[];
declare function box<V>(x: V): { value: V };
declare function numberBox(x: number[]): { value: number[] }
带有通用box
函数的PR示例正确地将listBox(1)
的参数类型强制为number
:
const listBox = pipe(list, box); // T is retained
const x1 = listBox(1); // ... argument properly inferred to number here
但是当我使用非通用的number[]
框函数时,参数的类型为any
:
const listNumberBox = pipe(list, numberBox)
const x21 = listNumberBox(1) // argument has any type
const x22 = listNumberBox("asdfasd") // this shouldn't be possible :/
我认为,具体类型的推断实际上比泛型(?)更“容易”,所以
1。)为什么最后一个示例的参数类型推断为any
?
2。)如何更改pipe
的函数签名以正确实施所有类型?