关于 TypeScript Truthiness narrowing 的一个疑问?

TypeScriptTruthiness narrowing 有如下介绍:

all coerce to false, and other values get coerced to true. You can always coerce values to booleans by running them through the Boolean function, or by using the shorter double-Boolean negation. (The latter has the advantage that TypeScript infers a narrow literal boolean type true, while inferring the first as type boolean.)
// both of these result in 'true'
Boolean("hello"); // type: boolean, value: true
!!"world"; // type: true,    value: true

当我键入以下代码时,类型提示却都是 boolean :

let x = Boolean('hello')
let y = !!'hello'

image.png

这是为何?

阅读 349
2 个回答

你应该是没有开启strictNullChecksstrict的配置,null严格检查没有开启时确实会显示boolean

默认情况下null和undefined是所有类型的子类型

也就是说当你没有开启严格检查时:

const str: 'hello' = null; // ok
const bol: true = null; // ok

换句话说你的所有类型都将变成anyType | null | undefined,以你的例子来说【strictNullChecks: false】:
!!"world"转成等价于!!"world" || !!null || !!undefined,即类型为:true | false | false,故最终类型为boolean

https://github.com/microsoft/TypeScript/issues/10564

因为你使用 let 声明变量,这代表它之后可能修改为其它值,ts 只能假设它为 boolean 类型,如果你改为使用 const 声明,可以看到变量的类型为 true:

const x = Boolean('hello') // boolean
const y = !!'hello' // true

你也可以手动声明变量的类型为 true:

let y: true = !!'hello'
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Microsoft
子站问答
访问
宣传栏