我对此感到困惑,无法弄清楚如何在没有第二个功能的情况下做到这一点:
interface Fixed { a: number }
const fn = <A, B extends {} = {}>(b: B) => {
return b
}
fn({ a: 1 }) // { a: number }
fn<Fixed>({ a: 1 }) // {}
const fn2 = <A>() => <B extends {} = {}>(b: B) => {
return b
}
const result = fn2<Fixed>()({ a: 1 }) // { a: number }
为什么如果我修复类型 A,Typescript 无法推断出 B 的类型?
如果我返回一个函数,该函数又尝试推断 B 的类型,那么一切都会再次正常。
类型推断基于全有或全无原则。在第一种情况下:
fn({ a: 1 })
没有提供泛型类型参数,因此它将推断两者:
-
B
将被推断为{ a: number }
基于函数参数;
- and
A
将被推断为unknown
因为它没有在函数中的任何地方使用。
在第二种情况下:
fn<Fixed>({ a: 1 })
您已经指定了其中一种泛型类型,不幸的是这意味着类型推断将不会用于其余类型参数- 所以:
-
A
指定为Fixed
;
-
B
没有给出,所以它不会推断它,而是默认为{}
.
尽管这很烦人,但这就是 TypeScript 的工作原理。您的第二个带有两个函数调用的示例是此问题的常见解决方法。
Related issue在 GitHub 上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)