以下泛型类型有何区别:
据我所了解,如果在任何情况下没有显式给出泛型类型,
然而,我找不到
在上述语句中,说
似乎,如果
type FnWithRequiredParam<T> = (t: T) => void
type FnWithParamInferred = <T>(t: T) => void
据我所了解,如果在任何情况下没有显式给出泛型类型,
FnWithRequiredParam
函数将始终失败。传递强制执行的泛型(例如FnWithRequiredParam<string>
)将在所有上下文中基本上将其转换为(t: string) => void
。然而,我找不到
FnWithParamInferred
的含义。在某些情况下,<T>
从使用它的位置推断出来(例如Array.map),但以下行会抛出错误:var f: FnWithParamInferred = (a: number) => { console.log(a) }
在上述语句中,说
number
和T
不兼容。那么实际上T
是什么?它从未被精确地声明,并且正在与另一种类型进行比较。在像<T>(...) => ...
这样的函数类型中定义泛型T
的规则是什么?似乎,如果
<T>
被定义为类/接口的必需泛型,例如Array<T>
,则数组的方法可以成功推断出T
。但如果它在类/接口之外,则类型推断似乎无法正常工作。