打字稿泛型返回类型
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<string>("hello")
在这种情况下 return num
是错误的。您没有确保T
与number
有任何关系,因此TS 将无法编译它,因为它不能保证兼容性。
【参考方案1】:
您必须像对待现有的任何类型一样对待T
。你的函数负责人说:我想要一个 T 类型的参数并返回 T 类型的东西。
但是,您的代码总是返回 number
,而不必是 T
。在您的示例调用中,它是,但您可以使用identity<string>("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);
【讨论】:
以上是关于打字稿泛型返回类型的主要内容,如果未能解决你的问题,请参考以下文章