为什么一种泛型函数不是泛型本身?

时间:2019-02-28 09:03:02

标签: typescript generics

请考虑以下示例代码:

interface so<T>
{
    a: T;
}

type test = <T>() => so<T>;

const so: test<number> = undefined;

哪个失败

  

类型“ test”不是通用

请解释。

1 个答案:

答案 0 :(得分:1)

起初这有点让人困惑,泛型基本上涉及两种函数签名的方式。它可以是作为函数的泛型类型,也可以是非泛型但代表泛型函数的类型。

例如:

type GenericTypeThatIsAFunction<T> = (o: T) => void
let functionThatIsNotGeneric: GenericTypeThatIsAFunction<number> // the generic type parameter is fixed
functionThatIsNotGeneric = (o: number) => { } // no generics here 
functionThatIsNotGeneric(1) // No generic here 


type TypeThatIsAGenericFunction = <T>(o: T) => void
let genericFunction: TypeThatIsAGenericFunction // the generic type is NOT fixed
genericFunction = <T>(o: T) => { } //  the implementation has to deal with any posible T
genericFunction(1) // T is not fixed to number for just this call 

在第一种情况(GenericTypeThatIsAFunction)中,您必须在声明站点指定类型参数,并将其永久固定在引用中。对引用的调用只能针对预先指定的类型进行。

在第二种情况(TypeThatIsAGenericFunction)中,您不指定类型参数,除非在调用站点(否则会推断出该参数)。该实现必须处理T的所有可能值。

虽然从泛型函数签名创建非泛型函数签名可能会很有用,但目前尚无语法支持此功能。有一些讨论允许这种行为,但是我无法说出它是针对近期最佳计划的(声明:不是编译器团队的成员,除了公共信息外,我对他们的计划没有任何见识)