为什么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 */) => {}),
});
对于fn和fn3,TS 能够推断出这foo是一个number. 但是,对于fn2,TS 只是输入foo为any. 对于打字fn2和fn3在功能上是一样的东西,所以我不知道为什么TS不能推断出的类型foo。
实际用例是 React 的useCallback,我试图推断通过useCallback.
为什么 TS 会这样?有没有更简单的解决方案?