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>