为什么Typescript不能为可选参数推断函数参数类型?

我认为在TS Playground上尝试更清楚:

function identity<T extends (...args: any[]) => any>(fn: T): T {
  return fn;
}

function fn(args: {
  cb: (foo: number) => void,
}) {}

fn({
  cb: identity((foo /* infers number */) => {}),
});

function fn2(args: {
  cb?: (foo: number) => void,
}) {}

fn2({
  cb: identity((foo /* doesn't infer number */) => {}),
});

function fn3(args: {
  cb: (foo: number) => void,
} | {}) {}

fn3({
  cb: identity((foo /* infers number */) => {}),
});

对于fnfn3,TS 能够推断出这foo是一个number. 但是,对于fn2,TS 只是输入fooany. 对于打字fn2fn3在功能上是一样的东西,所以我不知道为什么TS不能推断出的类型foo

实际用例是 React 的useCallback,我试图推断通过useCallback.

为什么 TS 会这样?有没有更简单的解决方案?

以上是为什么Typescript不能为可选参数推断函数参数类型?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>