我想要以下内容:
const a: unknown = 'this is a string';
const stringType = 'string';
if (typeof a === stringType){
console.log(a.toLocaleUpperCase())
}
但是它给了我一个错误:
'a' is of type 'unknown'
我知道如果我只是将 typeof a
与 'string'
进行比较,它会起作用,但我想将它与 const 变量进行比较。我该如何实现这一目标?有没有一些tsconfig.json
选项?
附注这样做的原因是为了优化我的代码。该代码应该针对每个用户请求运行数千次,因此我宁愿将其与已定义的变量进行比较,而不是每次都与新创建的字符串进行比较
这是不可能的。 TypeScript 中的“缩小”仅发生在非常特定的情况下,这些情况是为此目的而明确实现的,以处理惯用的编码模式。编译器不会花费资源来尝试确定您编写的内容在逻辑上是否等同于受支持的模式之一,因为此类分析的扩展性相当差。
typeof
类型gaurd
仅支持类似
if (typeof a === "string") {⋯}
的代码。它不支持 if ((typeof a) === "string") {⋯}
或 if (typeof a === ("string")) {⋯}
,请参阅 microsoft/TypeScript#8574。并且它不支持将
typeof a
或 "string"
保存到另一个变量并检查变量,请参阅 microsoft/TypeScript#49583。它也不支持比较
typeof a
与 typeof b
,请参阅 microsoft/TypeScript#21406。此类问题一旦提出,通常要么因为设计限制而被关闭,要么作为功能请求保持开放状态,等待社区的反馈,看看是否有足够的需求。到目前为止确实还没有。这些模式并不像支持的模式那么常见。 如果您确实希望看到它受到支持,您可以随时打开自己的功能请求(或在 microsoft/TypeScript#49583 上发表评论,这非常接近),但这实际上不太可能发生。特别是因为它缺乏令人信服的用例;没有任何迹象表明惯用的
if (typeof a === "string") {⋯}
在运行时的表现比不寻常的
if (typeof a === stringType) {⋯}
更差。我预计 "string"
最终会被任何合理的 JavaScript 引擎 interned,尽管这是否属实超出了所提出问题的范围。这似乎更适合常见的 JavaScript 实现是否使用字符串驻留?。除非您能够证明通过将
"string"
保存在变量中确实可以提高运行时性能,否则向 TypeScript 添加对它的缩小支持就没有令人信服的理由。