【问题标题】: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 将无法编译它,因为它不能保证兼容性。

标签: typescript


【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 2021-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-27
        • 2021-10-04
        • 2020-05-09
        • 2017-09-15
        相关资源
        最近更新 更多