TypeScript版本: 3.1.0-dev.20180728(在3.0.1中引入)
搜索词: isLiteral()
代码
- 在编译器API中创建一个布尔字面量。
- 调用
isLiteral()
。
更改似乎在这里完成:
e46d214#diff-233e1126c0abc811c4098757f9e4516eR428
预期行为: 对于布尔字面量类型(true
或false
),返回true
。
实际行为: 返回false
。
我为ts-simple-ast中的编译器API的一些假设做了一些测试,这个测试开始失败了。也许这不是一个bug,但我想还是记录一下,看看为什么这种行为发生了变化。
这是因为它没有Unit
标志,而字符串和数字字面量有吗?值得注意的是,在checker.ts中,对于isLiteralType
中的布尔字面量,它会内部返回true
。
7条答案
按热度按时间ijxebb2r1#
这是因为布尔字面量类型实际上并不是由
LiteralType
表示的,而是真正的IntrinsicType
。如果你将
.isLiteral()
理解为类型保护(这是一个LiteralType
的示例吗?),而不仅仅是一个告诉你它是否起源于字面量的函数,那么它就有点意义了。11dmarpk2#
让我们讨论一下是否应该修复这个@weswigham。
dhxwm5r43#
@ajafff 哦,好的观点!这些方法在
Type
上都是为了类型保护。另一个观点:通用的
LiteralType
接口的value
属性之前和现在都有类型string | number
而不是string | number | boolean
。所以
isLiteral()
的新行为似乎是为了修复当前的设计。话虽如此,作为一个 API 用户,它似乎有点出乎意料,布尔字面量类型没有包含在
LiteralType
中,但我没有一个使用场景会在意这个问题。s2j5cfk04#
他说,作为API用户,它似乎有点意外,布尔文字类型没有包含在LiteralType中,但我没有一个用例,其中它会有所区别。我经常需要它,这很烦人,参见$x_{1e0f1}^{x}$。
uz75evzq5#
共识是,这个函数应该返回
true
对于布尔值,如预期的那样。ymzxtsji6#
这是否意味着我们希望布尔值成为字面量?(booleanLiteral 继承自 Literal 并具有一个布尔类型的 'value' 属性)
hsgswve47#
我刚刚也遇到了这个问题(需要使用未记录的内部实现来获取布尔字面量类型的值)。所以要回答@Kingwl 的问题——是否打算向公共API添加一个
BooleanLiteralType
接口?任何进行此类更改的人应该注意什么?