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

dwbf0jvd  于 2022-12-01  发布在  TypeScript
关注(0)|答案(2)|浏览(170)

我是第一次尝试学习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变量也设置了 booleannumeric 类型,这不是一个问题吗?此外,如果TS编译器允许value1,因为它知道在分配给copiedValue变量时此变量持有“POST”,如果value2变量也拥有完全相同的“POST”值,那么它有什么问题?

eivgtgni

eivgtgni1#

如果copiedValue的类型是'POST',那么这是它唯一可以接受的值,你不应该把value1value2赋给它。
Typescript可能足够聪明,在这个特定的例子中,value1被显式地赋值为'POST',所以它可以安全地将它赋值给copiedValue,但这只是它给你的一个方便,因为这个值在编译时是已知的。
是的,我认为你是对的,在value2的情况下,它不能这样做,因为在'POST'应该被认为是'POST'类型还是string类型上有歧义。
一般来说,输入任何'EXPLICIT STRING HERE' | string都会给你带来这样的问题。我会说在(几乎?)每一种情况下,你都想枚举所有可能的字符串值 * 或 * 输入string,但不要两者都有。

tmb3ates

tmb3ates2#

value1变量也设置了布尔和数字类型,这不是一个问题吗?
总的来说,是的。
然而,在你的例子中,你已经将'POST'赋值给value1。这允许编译器推断,在程序中的那个点,直到对value1做了其他事情,它的类型是'POST'。有了这样推断的类型,赋值给copiedValue * 是 * 允许的。
尝试使用值false初始化value1,您将看到一个错误。
此外,如果TS编译器允许value1,因为它知道该变量在赋值给copiedValue变量时持有“POST”,那么如果value2变量也持有绝对相同的“POST”值,那么它有什么问题?
value2的情况下,添加的string类型意味着,在编译器的规则下,无法确定value2在代码中的相关点是'POST'还是string类型。编译器看起来不够复杂,无法做到这一点。
编译器要做到这一点,需要检查value2值的字符串内容是否未被处理(例如,添加一个字符将其值从'POST'转换为'POSTS')。很容易想象,添加这样的特性不是TypeScript团队的优先事项。

相关问题