我是第一次尝试学习TS,但有一个例子在我的脑海中并不十分吻合,假设我们有两个变量:
let value1: 'POST' | number | boolean = 'POST';
let value2: 'POST' | number | boolean | string = 'POST';
假设我们有另一个变量,我们要将上面指定的变量之一赋给它:
let copiedValue: 'POST'
当我为变量copiedValue赋值时,标记为value1的变量可以正常工作,但是当我尝试分配value2时,编译器显示了一个错误,我必须转换它来消除这个错误。我想这是因为我向value2变量添加了额外的 string 类型,TS编译器只是警告说,如果某个东西被标记为 string 它可以是任何东西,而不仅仅是“POST”,但value1变量也设置了 boolean 和 numeric 类型,这不是一个问题吗?此外,如果TS编译器允许value1,因为它知道在分配给copiedValue变量时此变量持有“POST”,如果value2变量也拥有完全相同的“POST”值,那么它有什么问题?
2条答案
按热度按时间eivgtgni1#
如果
copiedValue
的类型是'POST'
,那么这是它唯一可以接受的值,你不应该把value1
或value2
赋给它。Typescript可能足够聪明,在这个特定的例子中,
value1
被显式地赋值为'POST'
,所以它可以安全地将它赋值给copiedValue
,但这只是它给你的一个方便,因为这个值在编译时是已知的。是的,我认为你是对的,在
value2
的情况下,它不能这样做,因为在'POST'
应该被认为是'POST'
类型还是string
类型上有歧义。一般来说,输入任何
'EXPLICIT STRING HERE' | string
都会给你带来这样的问题。我会说在(几乎?)每一种情况下,你都想枚举所有可能的字符串值 * 或 * 输入string
,但不要两者都有。tmb3ates2#
value1变量也设置了布尔和数字类型,这不是一个问题吗?
总的来说,是的。
然而,在你的例子中,你已经将
'POST'
赋值给value1
。这允许编译器推断,在程序中的那个点,直到对value1
做了其他事情,它的类型是'POST'
。有了这样推断的类型,赋值给copiedValue
* 是 * 允许的。尝试使用值
false
初始化value1
,您将看到一个错误。此外,如果TS编译器允许value1,因为它知道该变量在赋值给copiedValue变量时持有“POST”,那么如果value2变量也持有绝对相同的“POST”值,那么它有什么问题?
在
value2
的情况下,添加的string
类型意味着,在编译器的规则下,无法确定value2
在代码中的相关点是'POST'
还是string
类型。编译器看起来不够复杂,无法做到这一点。编译器要做到这一点,需要检查
value2
值的字符串内容是否未被处理(例如,添加一个字符将其值从'POST'
转换为'POSTS'
)。很容易想象,添加这样的特性不是TypeScript团队的优先事项。