JavaScript 、TypeScript 中的 Boolean

boolean 是 JavaScript 中一种有趣的原始数据类型。在TypeScript中,非严格模式下("strictNullChecks": false),它总共容许4个值 true 、false、undefined、nulljavascript

JavaScript 中的 Boolean

boolean 能够取值 truefalse 。 其余类型的值能够是真值或假值,例如 undefinednulljava

let b = true
if(b) console.log('logged')

b = false
if(b) console.log('not logged')

b = undefined
if(b) console.log('not logged')

b = null
if(b) console.log('not logged')

要获取任何值对应的布尔值,可使用Boolean函数typescript

Boolean(false) // false
Boolean(true) // true
Boolean("false") // true ❗️
Boolean("Hey folks") // true
Boolean({}) // true
Boolean([]) // true
Boolean(123.4) // true
Boolean(Symbol()) // true
Boolean(function() {}) // true
Boolean(undefined) // false
Boolean(null) // false
Boolean(NaN) // false
Boolean(0) // false
Boolean("") // false

!! 运算也能够达到相似 Boolean() 的效果函数

const value = 'hello world';

Boolean(value); // true 
!!value; // true

Airbnb 的编码风格 偏向使用 !! 进行 boolean 值转换编码

const age = 0;

// bad
const hasAge = new Boolean(age);

// good
const hasAge = Boolean(age);

// best
const hasAge = !!age;

不少时候 !!Boolean() 能够相互替换。 !! 好处在于编码时快捷,但 Boolean() 是函数, 能够做为方法入参传递,很适合用来过滤集合中的空值。code

const collection = [
  { name: 'A'},
  undefined,
  "false",
  false,
  23,
  null
]

collection.filter(Boolean) //[{ name: 'A'}, "false", 23]

Number 转换函数一块儿使用,将全部值转换为对应的数字或NaN,这是一种快速获取实际值的很是酷的方法:对象

const x = ["1.23", 2137123, "wut", false, "lol", undefined, null]
  .map(Number)
  .filter(Boolean) // [1.23, 2137123] 👍

Boolean 有两种使用方式:ip

Boolean(value);		//做为转换函数,上面讲解的使用方式
new Boolean(value);	//做为构造函数

Boolean 做为构造函数使用,具备与做为转换函数相同的转换规则。 可是使用 new Boolean(...),将建立一个包装对象,使值比较相等,而引用比较却不相等:ci

const value = Boolean("test") // true
const reference = new Boolean("test") // [Boolean: true]

value == reference // true
value === reference // false

能够经过 .valueOf() 得到实际 boolean 值:get

value === reference.valueOf() // true

TypeScript 中的 Boolean

TypeScript 中的 boolean 是原始类型。 确保使用小写版本,而且不要引用 Boolean 的对象实例

const boolLiteral: boolean = false // 👍
const boolObject: Boolean = false // 👎

//生成的js代码
const boolLiteral = false; 
const boolObject = false;

虽然 ts 能够正常编译,且生成的 js 也同样,但这是一种很差的作法,会给使用者一种误导,他们会去用包装类型进行赋值,而咱们实际上不多须要引用包装类型。就像使用 new String(...) 不是一个很好的实践同样。

你能够在TypeScript中为 boolean 类型变量分配 true,false,undefinednull (由于 undefined、null 是全部类型的子类型),而无需严格的null检查。

const boolTrue: boolean = true // 👍
const boolFalse: boolean = false // 👍
const boolUndefined: boolean = undefined // 👍
const boolNull: boolean = null // 👍

所以,布尔值是惟一能够经过联合类型彻底表示的值

type MyBoolean = true | false | null | undefined // 等同 boolean

const mybool: MyBoolean = true
const yourbool: boolean = false

当咱们启用 strictNullChecks 编译器标志时,值的集合将减小为truefalse

const boolTrue: boolean = true // 👍
const boolFalse: boolean = false // 👍
const boolUndefined: boolean = undefined // 💥
const boolNull: boolean = null // 💥

所以咱们的集合总共减小为两个值。

type MyStrictBoolean = true | false

这时咱们可使用NonNullable helper类型摆脱null值:

type NonNullable<T> = T extends null | undefined
  ? never
  : T;

type MyStrictBoolean = NonNullable<MyBoolean> // true | false

boolean 类型结合 ts 的条件类型,能够构建一些有趣的类型。好比你更新、建立 用户共用一个类型,建立时不须要userId, 但更新时userId必传。

type PersonDto<Person, IsUpdateOrCreate> = 
    IsUpdateOrCreate extends true 
    ? Person & { userId: string }
    : Person & { userId?: string }

依赖于 IsUpdateOrCreate 的值,userId 被设置必填或选填。

在使用时,它可能声明一个这样的函数

declare function userUpdateOrCreate<P, A extends boolean = false>
  (personDto: PersonDto<P, A>, isUpdateOrCreate?: A): void

注意,我甚至为a设置了一个默认值,以确保为 PersonDto 提供A的类型信息,这取决因而否设置 isUpdateOrCreate

实际使用:

userUpdateOrCreate({}) 
userUpdateOrCreate({ name: '默认值' }) 
userUpdateOrCreate({ name: '张三' }, false) 
userUpdateOrCreate({ name: '李四' }, true) //  userId 缺失
userUpdateOrCreate({ name: '王二麻子', userId: 'asdf' }, true)

示例地址 TypeScript Playground

相关文章
相关标签/搜索