我有以下通用函数:
type Identity = <T extends string | number>(arg: T) => T;
const identity: Identity = (x) => x;
如果我尝试像这样使用此函数,就会收到无法重新分配的错误。
let a = identity('a');
a = 'b'; // Error: Type '"b"' is not assignable to type '"a"'
let b = identity(1);
b = 2; // Error: Type '2' is not assignable to type '1'
我期望从 identity
返回的类型应该是一个 string
或者 number
,但是实际上我得到的是字面量类型的 'a'
和 1
。为什么会这样?有没有一种方法可以改变我的约束条件来达到期望的行为?
我已经找到了几个解决方法。首先是将参数分配给一个变量:
let a_param = 'a'
let a = identity(a_param);
a = 'b'; // Yay
let b_param = 1;
let b = identity(b_param);
b = 2; // Yay
其次是将其转换为 string
或 number
:
let a = identity('a' as string);
a = 'b'; // Yay
let b = identity(1 as number);
b = 2; // Yay
这两种方式都不太对。我还在学习TS,所以我想我可能漏掉了点什么。