打字稿泛型返回类型

Posted

技术标签:

【中文标题】打字稿泛型返回类型【英文标题】:Typescript generics return type 【发布时间】:2020-06-29 18:53:54 【问题描述】:

我是 typescript 的新手,我正在尝试了解泛型是如何工作的。我想知道为什么下面的代码不飞:

function identity<T>(arg: T): T 
    let num: number = 2;
    return num;


let output = identity<number>(1);

我收到错误:类型“数字”不可分配给类型“T”。如果函数的输入是一个数字,这是否意味着 number 的返回类型也应该起作用,因为我们说 T 是 number 类型?

【问题讨论】:

T 不会必然是一个数字。例如,您可能有 identity&lt;string&gt;("hello") 在这种情况下 return num 是错误的。您没有确保Tnumber 有任何关系,因此TS 将无法编译它,因为它不能保证兼容性。 【参考方案1】:

您必须像对待现有的任何类型一样对待T。你的函数负责人说:我想要一个 T 类型的参数并返回 T 类型的东西。

但是,您的代码总是返回 number,而不必是 T。在您的示例调用中,它是,但您可以使用identity&lt;string&gt;("test") 调用它并期望返回一个字符串,但它仍然是number。于是就有了冲突。

【讨论】:

【参考方案2】:

让我们看看你的身份函数的类型签名。

function identity<T>(arg: T)

我们在这里说的是这个函数接受T类型的参数(我们没有提前指定,它可以是任何东西),它返回一个T类型的值。

鉴于没有任何关于T 的信息,唯一可以返回这种类型值的函数是重用提供的参数。换句话说,恒等函数只有一种可能的实现——返回其参数的那个。

function identity<T>(arg: T)  return arg 

错误消息准确地告诉您:Type 'number' is not assignable to type 'T',这是正确的,因为T 是通用的:)

【讨论】:

【参考方案3】:

小故事,你应该像这样更正你的函数:

function identity<T>(arg: T): T 
    let num: T = arg;
    return num;


let output = identity<number>(1)


console.log(output);

【讨论】:

以上是关于打字稿泛型返回类型的主要内容,如果未能解决你的问题,请参考以下文章

打字稿泛型类型 T toString

打字稿泛型,获取数组内容的类型

打字稿泛型-“扩展对象”毫无意义吗?最佳做法是啥?

typescript 打字稿泛型示例

typescript 打字稿泛型

打字稿泛型类参数