gpt4 book ai didi

Typescript 泛型、约束和文字类型

转载 作者:行者123 更新时间:2023-12-04 14:09:16 25 4
gpt4 key购买 nike

我有以下通用函数:

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 返回的类型是 stringnumber,但是看起来我得到的是文字类型'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

然后转换为 stringnumber:

let a = identity('a' as string);
a = 'b'; // Yay

let b = identity(1 as number);
b = 2; // Yay

这两种感觉都不对。我仍在学习 TS,所以我想我错过了一些东西。

最佳答案

类型参数通常会被推断为与参数一致的最具体的可能类型;在这种情况下,字符串文字类型 'a'。这几乎总是期望的行为。

在您的情况下,推断类型过于严格,因为您将其用作变量的推断类型,而不仅仅是表达式的推断类型。所以一个自然的解决方案是指定一个较弱的类型参数,如下所示:

let a = identity<string>('a');

但是,简单地指定变量的类型会更正常:

let a: string = identity('a');

关于Typescript 泛型、约束和文字类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65743826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com