gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:02:43 25 4
gpt4 key购买 nike

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

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) }

numberT不相容。在上一行中,实际上是 T ?它从未被准确地声明过,并且正在与另一种类型进行比较。判断什么是泛型的规则是什么T在函数类型中定义,如 <T>(...) => ...

似乎,如果<T>被定义为类/接口(interface)的必需泛型,例如一个Array<T> , 然后方法 od array 可以成功推断出 T .但如果它在类/接口(interface)之外,类型推断似乎不起作用。

最佳答案

两者在定义的函数签名上有很大的不同。

  • 首先定义一个常规的函数签名,使用时可以自定义一个类型参数,并且该类型成为固定在签名中
  • 第二个定义了一个通用函数签名,即一个可以接受任何类型 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

您收到错误的原因是您试图将一个带有 number 参数的函数分配给一个应该接受任何类型 T 参数的函数, T 由函数的调用者决定。只有泛型函数才能满足类型FnWithParamInferred

var f: FnWithParamInferred = <T>(a: T) => { console.log(a) }

我认为您真正想要的是能够从变量声明中省略显式类型参数,并根据分配给它的值来推断它。 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>

关于typescript - TypeScript 中必需的与推断的泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54225839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com