管道函数参数类型推断为任何

时间:2019-11-11 18:54:23

标签: typescript functional-programming typescript-generics

基于我测试过的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的函数签名以正确实施所有类型?

0 个答案:

没有答案