【问题标题】:Typescript literal types and addition assignment operators打字稿文字类型和加法赋值运算符
【发布时间】:2020-07-26 09:42:16
【问题描述】:

对于typescriptliteral types,无论我们使用常规加法运算符(例如a = a + b)还是加法赋值运算符(例如a += b),行为都是不同的:

type SomeLiteralType = 1;

let a: SomeLiteralType = 1;

// Why is it possible to change the value of Literal type to unsupported value without any error?
a += 1;

// Now it's even not allowed to assign to itself - next error occurs: "Type 'number' is not assignable to type '1'"
a = a;

所以最终使用加法赋值运算符我们可以强制变量包含意外值。

字符串也是如此。

这是预期的行为吗?我在文档中遗漏了一些内容?

【问题讨论】:

    标签: typescript language-design assignment-operator


    【解决方案1】:

    1) c += b;a += a; 在类型检查过程中是相等的。
    怎么回事的解释可以在4)找到。

    2) d = d + b;
    该表达式将由编译器解释如下:
    赋值表达式:
    左侧:d
    令牌(运营商):=
    右侧:d + b
    为了检查两边的类型,编译器对左右表达式进行类型扣除。
    如果是左侧,它很简单。
    对于右侧,它将是数字。 原因是所有数学运算符(+-、...)只能用于数字(在 jJavaScript 中),因此结果也必须是数字类型。
    使用左侧的扣除类型Odd 和右侧的数字,您将得到错误。

    3) e = a + a;
    与上一行相同的原因 (2))

    4) a += a; 这个表达式归结为:
    赋值表达式: 左侧:a
    令牌(运营商):+=
    右侧:a
    从上面我们知道,所有的数学运算符都只能应用于数字,
    这应该是不言自明的。编译器检查左边是否为数字,
    其中a 是,如果右侧是数字。 a1 都是数字,所以它可以工作。

    为什么最后一行有效,现在应该清楚了,我将把它作为家庭作业留给你;)

    【讨论】:

    • 感谢您的回答。我已经简化了代码示例以强调主要问题。
    • 可以保留一些示例,否则我的回答中的很多内容似乎断章取义;)
    猜你喜欢
    • 2022-06-28
    • 2016-02-25
    • 2022-07-21
    • 2020-03-01
    • 2016-03-14
    • 2016-09-14
    • 2018-06-08
    相关资源
    最近更新 更多