推断类型“1”而不是数字

Shi*_*gla 5 typescript

我有这个打字稿代码

type X = (<T extends number | string>(a: T) => (b: T) => T)

const f: X = (a: any) => (b: any) => a + b

f(1)(2)
Run Code Online (Sandbox Code Playgroud)

它显示错误

Argument of type '2' is not assignable to parameter of type '1'.
Run Code Online (Sandbox Code Playgroud)

第一个参数中的推断类型是'1'但我希望它对number泛型具有相同的约束string | number。

传递的参数类型只能是number或 ,string即约束为string | number。

操场

gur*_*sko 3

这对你的情况有用吗?

type XGen<T extends string | number> = (a: T) => (b: T) => T;
type X = XGen<string> & XGen<number>;
const f: X = (a: any) => (b: any) => a + b;

f(1)(2);
f(1)('2'); // error
f('1')('2');
f([])([]); // error
Run Code Online (Sandbox Code Playgroud)

目标是指示 TypeScript 仅在string和之间进行选择number(不猜测扩展其联合的任何其他类型(例如1在您的示例中))。我们通过创建一个基本的通用帮助器类型并创建 和 的交集类型(因此强制打字稿仅在这两者之间进行选择)来实现这XGen一点。XGen<string>XGen<number>