如何在TypeScript中正确地使用文字类型?



我是第一次尝试学习TS,但是有一个案例,在我的印象中不是很好。假设我们有两个变量:

let value1: 'POST' | number | boolean = 'POST';
let value2: 'POST' | number | boolean | string = 'POST';

假设我们有另一个变量,我们想给上面指定的一个变量赋值:

let copiedValue: 'POST'

当我赋值给变量时,copiedValue变量标签value1它工作正常,但当我试图分配value2编译器显示了一个错误,我必须强制转换它来消除这个错误。我想这是因为我添加到value2的附加字符串类型变量和TS编译器只是警告,如果一些东西被标记为字符串它可以是任何东西,而不仅仅是'POST',但这不是一个问题,value1变量有布尔数值类型设置在它上面吗?另外,如果TS编译器允许value1因为它知道这个变量保存着"POST"在赋值给时,copyedvalue变量value2有什么问题?变量,如果它也拥有完全相同的"POST"价值吗?

如果copiedValue'POST'类型,则该值是它可以接受的唯一值。就类型而言,您不应该将value1value2分配给它。

Typescript可能足够聪明,在这种特殊情况下,value1被显式地赋值为'POST',因此它可以安全地将其赋值给copiedValue,但这只是它给你的方便,因为这个值在编译时是已知的。

是的,我认为你是对的,在value2的情况下不能这样做,因为在'POST'应该被认为是'POST'类型还是string类型方面存在歧义。

一般来说,输入任何'EXPLICIT STRING HERE' | string都会给你这些问题。我想说的是,在(几乎?)每种情况下,您都希望枚举所有可能的字符串值键入string,但不是两者都要。

是不是value1变量有布尔和数字类型设置在它上面的问题?

一般来说,是的。

然而,在您的情况下,您已将'POST'分配给value1。这允许编译器推断,在程序的这一点上,直到对value1做了其他操作,它的类型是'POST'。对于这样推断的类型,允许对copiedValue赋值

尝试用值false初始化value1,你会看到你得到一个错误。

同样,如果TS编译器允许value1,因为它知道这个变量保存"POST"在赋值给copiedValue变量的时候,如果value2变量也拥有完全相同的"POST"价值吗?

对于value2,增加类型string意味着在编译器的规则下,在代码的相关点无法确定value2的类型是'POST'还是string。编译器似乎不够复杂,无法做到这一点。

对于编译器来说,它需要检查没有对value2的值的字符串内容进行操作(例如,添加一个字符将其值从'POST'转换为'POSTS')。很容易想象,添加这样一个特性并不是TypeScript团队的优先级。

最新更新