TypeScript 泛型函数的类型
Posted
技术标签:
【中文标题】TypeScript 泛型函数的类型【英文标题】:TypeScript Type of generic function 【发布时间】:2018-07-03 15:43:27 【问题描述】:我无法理解 TypeScript 文档中的以下段落:
"泛型函数的类型和非泛型函数一样,类型参数在前,类似于函数声明:"
function identity<T>(arg: T): T
return arg;
let myIdentity: <T>(arg: T) => T = identity;
最后一行有什么作用,为什么要使用它?
据我了解,myIdentity 是一个获取身份函数类型的变量吗?如果是这种情况,为什么我需要定义这样一个变量?函数标识已经声明了我可以期望的返回类型。
【问题讨论】:
至于“为什么我需要定义这样一个变量”的问题,答案是在这种情况下你不需要。它只是作为另一种语法的示例,用于声明具有该类型的函数。 【参考方案1】:假设从编译器的角度来看,显式类型声明不是必需的 因为类型推断。
let myIdentity: <T>(arg: T) => T = identity;
等价于
let myIdentity = identity
不过,从人的角度来看,它可以用来提高代码的可读性。
【讨论】:
所以如果我要定义一个类型type Identity<T> = <T>(arg: T) => T
,然后再定义let myIdentity: Identity<T> = (e: T) => e
,那是不是非法的?
是的,这是错误的。声明像type Identity<T> = (arg: T) => T
这样的泛型类型别名然后像let myIdentity: Identity<String> = (arg: String) => arg
一样使用它是合法的。 Identity<T>
是泛型类型别名,在声明Identity<T>
类型的变量时必须定义特定类型,在本例中为String
。【参考方案2】:
最后一行声明了一个名为myIdentity
的变量。该变量是一个函数类型,一个泛型函数(<T>
使其成为泛型函数的签名,列表中可能包含更多类型参数),它接受T
类型的参数并返回一个类型的值T
。然后用符合myIdentity声明签名的identity
函数初始化变量。
您可能希望这样做,以便根据运行时条件为myIdentity
分配不同的功能。或者声明一个这种类型的参数并将其传递给稍后可以调用它的函数。
【讨论】:
以上是关于TypeScript 泛型函数的类型的主要内容,如果未能解决你的问题,请参考以下文章