常見的三種值類型
數(shù)字類型
// 申明一個數(shù)字類型的值
let a: number
a = 10
字符串類型
// 申明一個字符串類型的值
let b: string = 'hello'
布爾類型
// 申明一個bool類型的值
let c: boolean = true
PS:類型注釋
冒號 + 類型的叫類型注釋
即: string
這種叫類型注釋
其他常見類型
字面量類型
// 字面量進行類型申明(字面量:即就是這個值本身)
let aa: 10
// a修改為其他值就會報錯
aa = 11
// 實際開發(fā)中很少這么用,但是我們可以這么用
// 申明一個變量等于男或者女
let sex: 'male' | 'female'
// 我們使用的時候就可以賦值其中一個值蹦渣,賦值其他值就會報錯
sex = 'male'
sex = 'female'
sex = 'hello'
聯(lián)合類型
// | 線可以用來連接多個類型(聯(lián)合類型)
// 除了用在字面量中往果,常規(guī)的使用當(dāng)中有的更多
let bb: boolean | number
bb = true
bb = 123
// 賦值字符串,就錯了
bb = 'hi'
any類型
// 申明任意類型的數(shù)據(jù)
// any表示任意類型,一個變量設(shè)置為any后相當(dāng)于對該變量關(guān)閉了TS的類型檢測
let cc: any
cc = 123
cc = true
cc = 'hi'
// 隱式any,即申明,但是不設(shè)置類型占拍,如下
let dd
dd = 123
unknown類型
// unknown 表示未知類型
let ee: unknown
ee = 123
ee = true
ee = 'hi'
any和unknown比較
// 那么any和unknown有什么區(qū)別呢?
// any可以賦值給任何變量
let ff: string
ff = cc
// unknown實際上就是一個類型安全的any
// unknown類型的變量不能直接賦值給其他變量
let gg: string
gg = ee
// 如何處理這種報錯呢捎迫?
// 1.類型判斷
if(typeof ee === 'string') {
gg == ee
}
// 2.類型斷言(意思是晃酒,ee就是一個string,你就放心用了)
gg = ee as string
gg = <string>ee
PS:類型斷言
- 斷言語法
- 1.變量 as 類型
- 2.<類型>變量
void類型
// void用來表示空窄绒,以函數(shù)為例贝次,表示沒有返回值的函數(shù)
function fn():void {
console.log(11111)
}
// never表示永遠(yuǎn)不會返回結(jié)果
function fn2(): never {
throw new Error('出錯了')
}
object類型
// object表示一個js對象
let obj: object
obj = {}
obj = function() {
}
// js中對象太多了,一般不像上面這樣申明彰导,那么我們在上面時候用這種形式呢蛔翅?
// 比如我們申明一個變量,但是我們希望變量中包含某個值時
let obj2: {name: string}
// 這樣是正確的
obj2 = {name: '景天'}
// 這樣就會報錯
obj2 = {}
// 寫多了也會報錯
obj2 = {name: '景天',age:18}
// 那么我們就是要age位谋,而且age也不確定有沒有山析,怎么寫呢?
let obj3: {name: string,age?: number}
// 這樣都正確
obj3 = {name: '景天'}
obj3 = {name: '景天',age:18}
// 但是實際開發(fā)中掏父,我們還會有不確定有多少其他屬性值笋轨,怎么處理呢?
let obj4: {name: string, [propName:string]:any}
// 這樣的話赊淑,除了要求的值爵政,其他隨便寫不寫,寫什么都無所謂了
obj4 = {
name: '景天',
age: 18,
c: true
}
函數(shù)
// 如何設(shè)置函數(shù)的類型申明呢膏燃?
// 這表示函數(shù)兩個參數(shù)茂卦,都是number類型,返回值也是number類型
let fn1: (a:number,b:number) => number
fn1 = function(n1,n2) {
return n1 + n2
}
// 函數(shù)中使用另一種類型限制
// ): number是限制返回值的類型的
function add(a: number,b:number): string {
return String(a + b)
}
數(shù)組
/*
array,兩種申明方式(這也是一種泛型的寫法)
1. 類型[]
2. Array<類型>
*/
// 純字符串?dāng)?shù)組
let arr: string[]
arr = ['a','b','c']
// 純數(shù)字?jǐn)?shù)組
let arr2: Array<number>
arr2 = [1,2,3]
元組
// tuple(元組):固定長度的數(shù)組
let yuanzu: [string,number]
yuanzu = ['111',222]
枚舉
// enum: 枚舉
// 申明一個枚舉類
enum Gender {
male = 1,
female = 0
}
let hh: {name: string,gender: Gender}
hh = {
name: '景天',
gender: Gender.male
}
類型的別名
// 類型的別名
type myType = string
// 這相當(dāng)于還是string
let ii: myType
// 但是這樣的話组哩,通常沒什么意義,而我們用字面量類型的時候处渣,有時候可以使用
type jjType = 1 | 2 | 3 | 4 | 5 | 6
// 這樣無論我們多少個地方使用伶贰,都可以直接用了
let jj: jjType
let kk: jjType
let ll: jjType
// 任何類型都可以有別名
// 比如object
type obj = {
x:number,
y:number
}
// 別名的擴展
// 一個新的obj1在上面的obj的基礎(chǔ)上擴展
type obj1 = obj & {
z: number
}
JS在ES6以后加的兩個類型
bigint
- 意為比較大的整數(shù)
- ES2020以后添加
// 括號里面可以是number 和 string
const bigNumber: bigint = BigInt(123)
const bigNumber2: bigint = 456n
console.log(bigNumber) // 123n,打印發(fā)現(xiàn)是有個n在數(shù)字后面罐栈,但是我們使用值得時候黍衙,是沒有n的
console.log(bigNumber2) // 456n
symbol
- 意為全局唯一引用
const firstName = Symbol('name')