TypeScript中必需的与推断的泛型类型

TypeScript中必需的与推断的泛型类型,typescript,generics,type-systems,Typescript,Generics,Type Systems,以下泛型类型之间有什么区别: type FnWithRequiredParam<T> = (t: T) => void type FnWithParamInferred = <T>(t: T) => void 说number和T不兼容。在上面的一行中,什么是T?它从未被精确地声明过,并且正在与另一种类型进行比较。确定在函数类型(如(…)=>…)中定义的泛型T的规则是什么 似乎,如果被定义为类/接口的必需泛型,例如数组,那么方法od数组可以成功地推断T。但是如

以下泛型类型之间有什么区别:

type FnWithRequiredParam<T> = (t: T) => void
type FnWithParamInferred = <T>(t: T) => void
number
T
不兼容。在上面的一行中,什么是
T
?它从未被精确地声明过,并且正在与另一种类型进行比较。确定在函数类型(如
(…)=>…
)中定义的泛型
T
的规则是什么


似乎,如果
被定义为类/接口的必需泛型,例如
数组
,那么方法od数组可以成功地推断
T
。但是如果它在类/接口之外,类型推断似乎不起作用。

这两种方法在定义的函数签名方面有很大的不同

  • 第一个定义了一个常规函数签名,在使用时可以使用类型参数对其进行自定义,并且该类型在签名中是固定的
  • 第二个定义了一个通用函数签名,这是一个可以接受任何类型的参数
    T
    ,调用函数时可以推断(或明确指定)该参数的函数
考虑下列声明:

declare const fn: FnWithRequiredParam<number> 
declare const genericFn: FnWithParamInferred;

// T was fixed on declaration 
fn(1) // ok
fn("1") // err  

// T is decded by the caller
genericFn(1) // ok T is number for this call
genericFn("1") // ok T is string  for this call
genericFn<number>("1") // err T was specified as number but string was passed in 
我认为您真正想要的是能够从变量声明中省略显式类型参数,并根据分配给它的值对其进行推断。Typescript不支持此操作。如果为变量定义类型注释,则不会对该变量进行推断

您可以完全省略类型注释,让编译器推断函数类型:

var f = (a: number) => { console.log(a) } // inferred as (a: number) => void
或者,您可以定义一个泛型助手函数来推断
T
,但基于
FnWithRequiredParam

function createFunction<T>(fn: FnWithRequiredParam<T>) {
    return fn;
}

var f = createFunction((a: number) => { console.log(a) }) // inferred as FnWithRequiredParam<number>
函数createFunction(fn:FnWithRequiredParam){
返回fn;
}
var f=createFunction((a:number)=>{console.log(a)})//推断为FnWithRequiredParam

非常感谢提香!那么,我试图通过将泛型函数赋给特定类型的函数来错误地推断,这是真的吗;正确的推断方法不是赋值,而是调用函数?
var f = (a: number) => { console.log(a) } // inferred as (a: number) => void
function createFunction<T>(fn: FnWithRequiredParam<T>) {
    return fn;
}

var f = createFunction((a: number) => { console.log(a) }) // inferred as FnWithRequiredParam<number>