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

相關文章
相關標籤/搜索