我一般都是通过箭头语法来手动策动我的函数。似乎一到通用类型参数的时候,类型推理就会出现问题。
type Const<A, B> = { const: A };
const Const = <A, B>(x: A): Const<A, B> => ({ const: x });
const map = <F, A, B>(f: (_: A) => B) => (tx: Const<F, B>) => tx;
const inc = (x: number) => x + 1;
const foo = map(inc) (Const("foo")); // Const<unknown, number> instead of <string, number>
当我解开绳子的时候 map
一切都按预期工作。我怎样才能在不失去类型推理的情况下保持函数的库里?
你只需要把类型参数移到实际用作参数的函数中。
在这种情况下,我们需要将类型参数移到实际用作参数的函数中。F
中没有推理的部位。map
,它只用于返回类型(从被调用的返回类型推断,并不是TS所做的事情,在其他情况下它会从返回类型推断,但不是这样)。将类型参数移到由 map
让第二次调用推断 F
并产生预期的类型。
type Const<A, B> = { const: A };
const Const = <A, B>(x: A): Const<A, B> => ({ const: x });
const map = <A, B>(f: (_: A) => B) => <F>(tx: Const<F, B>) => tx;
const inc = (x: number) => x + 1;
const foo = map(inc) (Const("foo"));