boolean
是 JavaScript 中一種有趣的原始數據類型。在TypeScript中,非嚴格模式下("strictNullChecks": false
),它總共容許4個值 true 、false、undefined、null
。javascript
boolean
能夠取值 true
或 false
。 其餘類型的值能夠是真值或假值,例如 undefined
或 null
。java
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
是原始類型。 確保使用小寫版本,而且不要引用 Boolean
的對象實例
const boolLiteral: boolean = false // 👍 const boolObject: Boolean = false // 👎 //生成的js代碼 const boolLiteral = false; const boolObject = false;
雖然 ts
能夠正常編譯,且生成的 js
也同樣,但這是一種很差的作法,會給使用者一種誤導,他們會去用包裝類型進行賦值,而咱們實際上不多須要引用包裝類型。就像使用 new String(...)
不是一個很好的實踐同樣。
你能夠在TypeScript中爲 boolean
類型變量分配 true,false,undefined
和null
(由於 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
編譯器標誌時,值的集合將減小爲true
和false
。
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)