Typescript泛型返回类型

Typescript泛型返回类型,typescript,Typescript,我对typescript还不熟悉,我正试图了解泛型是如何工作的。我想知道为什么下面的代码不能运行: function identity<T>(arg: T): T { let num: number = 2; return num; } let output = identity<number>(1); 函数标识(arg:T):T{ 设num:number=2; 返回num; } 让输出=标识(1); 我得到一个错误:类型“number”不能分配给类

我对typescript还不熟悉,我正试图了解泛型是如何工作的。我想知道为什么下面的代码不能运行:

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

let output = identity<number>(1);
函数标识(arg:T):T{
设num:number=2;
返回num;
}
让输出=标识(1);

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

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


但是,您的代码总是返回一个
数字
,该数字不必是
T
。在您的示例中,调用它是,但您可以使用
identity(“test”)
调用它,并期望返回一个字符串,但它仍然是一个
数字。因此,冲突。

你必须像对待任何现存的类型一样对待
T
。你的函数头说:我想要一个类型为T的参数,并返回类型为T的东西


但是,您的代码总是返回一个
数字
,该数字不必是
T
。在您的示例中,调用它是,但您可以使用
identity(“test”)
调用它,并期望返回一个字符串,但它仍然是一个
数字。因此,confict。

让我们看看您的标识函数的类型签名

函数标识(arg:T)
我们在这里要说的是,这个函数接受一个
T
类型的参数(我们没有预先指定,它可以是任何类型),并且它返回一个
T
类型的值

假设没有关于
T
的任何信息,函数只能返回此类类型的值,即重用提供的参数。换句话说,identity函数只有一个可能的实现——返回其参数的实现

函数标识(arg:T){return arg}

错误消息正是这样告诉您的:
Type'number'不能分配给Type'T'
,这是正确的,因为
T
是通用的:)

让我们看看您的标识函数的类型签名

函数标识(arg:T)
我们在这里要说的是,这个函数接受一个
T
类型的参数(我们没有预先指定,它可以是任何类型),并且它返回一个
T
类型的值

假设没有关于
T
的任何信息,函数只能返回此类类型的值,即重用提供的参数。换句话说,identity函数只有一个可能的实现——返回其参数的实现

函数标识(arg:T){return arg}

错误消息正是这样告诉您的:
Type'number'不可分配给Type'T'
,这是正确的,因为
T
是通用的:)

简而言之,您应该像这样更正您的函数:

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

let output = identity<number>(1)


console.log(output);
函数标识(arg:T):T{
让num:T=arg;
返回num;
}
让输出=标识(1)
控制台日志(输出);

简而言之,您应该这样更正您的函数:

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

let output = identity<number>(1)


console.log(output);
函数标识(arg:T):T{
让num:T=arg;
返回num;
}
让输出=标识(1)
控制台日志(输出);

T
不一定是一个数字。例如,您可能有
identity(“hello”)
,在这种情况下
returnnum
将是错误的。您没有设置任何内容来确保
T
number
有任何关联,因此TS将无法编译此项,因为它无法保证兼容性。
T
不一定是一个数字。例如,您可能有
identity(“hello”)
,在这种情况下
returnnum
将是错误的。您没有设置任何内容来确保
T
在任何方面与
number
相关,因此TS将无法编译此文件,因为它无法保证兼容性。