我是第一次尝试学习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'
类型,则该值是它可以接受的唯一值。就类型而言,您不应该将value1
或value2
分配给它。
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团队的优先级。