请考虑以下示例代码:
interface so<T>
{
a: T;
}
type test = <T>() => so<T>;
const so: test<number> = undefined;
哪个失败
类型“ test”不是通用
请解释。
答案 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
的所有可能值。
虽然从泛型函数签名创建非泛型函数签名可能会很有用,但目前尚无语法支持此功能。有一些讨论允许这种行为,但是我无法说出它是针对近期最佳计划的(声明:不是编译器团队的成员,除了公共信息外,我对他们的计划没有任何见识)