我正试图了解type variables for funcitons。该示例仅使用一个,但我尝试将其扩展为两个。各种输入会产生我不理解的输出。
function id<T, U>(arg1, arg2: U): U{ // error 1 below
// return arg2 + arg2; // when uncommented, error 2 below
return arg2 * 2
// ^--^ error 3 below
//^-------------^ error 4 below
}
var result = id<string, number>('lorem', 10)
错误1
Parameter 'arg1' implicitly has an 'any' type.
错误2
error Operator '+' cannot be applied to types 'U' and 'U'.
错误3
The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.
错误4
Type 'number' is not assignable to type 'U'.
我在几个方面感到困惑,所以请随时提出以下建议:
1:不使用<string, number>
指定参数类型向被调用函数注册,这些是所提供参数的类型。为什么需要在参数列表中再次给出: T
?
2:U
这里应该是一个数字,为什么我不能加上它?
3:我不明白此错误的真正根源。
4:如果我不带乘法就简单地返回arg2
,则此方法有效。我不明白为什么我不能在这里返回数字。
答案 0 :(得分:1)
第一个错误告诉您,应该始终将类型添加到参数中。 arg1
当前未键入。
其他错误告诉您:
您只能加(+
)个数字和字符串,而不能加所有内容(例如对象)。这就是为什么必须将通用U缩小为字符串或数字的原因。
您只能将数字(*
)和BigInts相乘。
这里的要点是:该功能必须在任何可能的情况下都可以正常工作。
答案 1 :(得分:0)
1:不使用注册到指定参数类型 这些是提供的参数类型的调用函数。 这些需求为何如此:需要在参数中再次给出T 清单?
函数声明中的类型不与其参数映射为1:1。如果您希望arg1
的类型为U
,则需要指定它。
2:U在这里应该只是一个数字,为什么我不能加上它?
3:我不明白此错误的真正根源。
4:如果我不带乘法就简单地返回arg2,则此方法有效。一世 不明白为什么我不能在这里返回数字。
只需告诉TypeScript U
是一个数字:<T, U extends number>
。
还要注意,在这种情况下,编译器可以确定函数的返回类型,因此可以忽略它。我想您想结束这样的事情:
function id<T, U extends number>(arg1: T, arg2: U) {
return arg2 * 2;
}
答案 2 :(得分:0)
""
在您的函数内部使用SomeClass道具。并且您可以编写“ U扩展数”以支持加/减运算。您还可以使用对象的valueOf函数(由js在后台使用)并将arg2强制转换为“ any”(如果您的参数已为数字,则无需使用valueOf):
function id<T, U extends SomeClass>(...)