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&lt;T&gt; = &lt;T&gt;(arg: T) =&gt; T,然后再定义let myIdentity: Identity&lt;T&gt; = (e: T) =&gt; e,那是不是非法的? 是的,这是错误的。声明像type Identity&lt;T&gt; = (arg: T) =&gt; T 这样的泛型类型别名然后像let myIdentity: Identity&lt;String&gt; = (arg: String) =&gt; arg 一样使用它是合法的。 Identity&lt;T&gt; 是泛型类型别名,在声明Identity&lt;T&gt; 类型的变量时必须定义特定类型,在本例中为String【参考方案2】:

最后一行声明了一个名为myIdentity 的变量。该变量是一个函数类型,一个泛型函数(&lt;T&gt; 使其成为泛型函数的签名,列表中可能包含更多类型参数),它接受T 类型的参数并返回一个类型的值T。然后用符合myIdentity声明签名的identity函数初始化变量。

您可能希望这样做,以便根据运行时条件为myIdentity 分配不同的功能。或者声明一个这种类型的参数并将其传递给稍后可以调用它的函数。

【讨论】:

以上是关于TypeScript 泛型函数的类型的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 TypeScript 中传播独特的泛型类型?

Typescript 从具有泛型类型的对象索引调用函数

Typescript #6 泛型

在 TypeScript 中推断泛型函数类型

TypeScript--泛型

TypeScript--泛型