TypeScript `type.isLiteral()` 对于布尔字面量返回 false,

vtwuwzda  于 6个月前  发布在  TypeScript
关注(0)|答案(7)|浏览(60)

TypeScript版本: 3.1.0-dev.20180728(在3.0.1中引入)
搜索词: isLiteral()
代码

  1. 在编译器API中创建一个布尔字面量。
  2. 调用isLiteral()
    更改似乎在这里完成:
    e46d214#diff-233e1126c0abc811c4098757f9e4516eR428

预期行为: 对于布尔字面量类型(truefalse),返回true
实际行为: 返回false

我为ts-simple-ast中的编译器API的一些假设做了一些测试,这个测试开始失败了。也许这不是一个bug,但我想还是记录一下,看看为什么这种行为发生了变化。
这是因为它没有Unit标志,而字符串和数字字面量有吗?值得注意的是,在checker.ts中,对于isLiteralType中的布尔字面量,它会内部返回true

ijxebb2r

ijxebb2r1#

这是因为布尔字面量类型实际上并不是由 LiteralType 表示的,而是真正的 IntrinsicType
如果你将 .isLiteral() 理解为类型保护(这是一个 LiteralType 的示例吗?),而不仅仅是一个告诉你它是否起源于字面量的函数,那么它就有点意义了。

11dmarpk

11dmarpk2#

让我们讨论一下是否应该修复这个@weswigham。

dhxwm5r4

dhxwm5r43#

@ajafff 哦,好的观点!这些方法在 Type 上都是为了类型保护。
另一个观点:通用的 LiteralType 接口的 value 属性之前和现在都有类型 string | number 而不是 string | number | boolean

interface LiteralType extends Type {
    value: string | number;
    // ...
}

所以 isLiteral() 的新行为似乎是为了修复当前的设计。
话虽如此,作为一个 API 用户,它似乎有点出乎意料,布尔字面量类型没有包含在 LiteralType 中,但我没有一个使用场景会在意这个问题。

s2j5cfk0

s2j5cfk04#

他说,作为API用户,它似乎有点意外,布尔文字类型没有包含在LiteralType中,但我没有一个用例,其中它会有所区别。我经常需要它,这很烦人,参见$x_{1e0f1}^{x}$。

uz75evzq

uz75evzq5#

共识是,这个函数应该返回 true 对于布尔值,如预期的那样。

ymzxtsji

ymzxtsji6#

这是否意味着我们希望布尔值成为字面量?(booleanLiteral 继承自 Literal 并具有一个布尔类型的 'value' 属性)

hsgswve4

hsgswve47#

我刚刚也遇到了这个问题(需要使用未记录的内部实现来获取布尔字面量类型的值)。所以要回答@Kingwl 的问题——是否打算向公共API添加一个 BooleanLiteralType 接口?任何进行此类更改的人应该注意什么?

相关问题