ts的基本數據類型
1.布爾 boolean true/false
let isDone:boolean = false
2.數字 ts里數字都是浮點數 number 十進制 十六進制 二進制 八進制
3.字符串
形式1:引號 ' "" 和js一樣 let name:string='bb'+myName
形式2:模板字符串(多行文本和內嵌表達式) ` ${} let name:string= `我的名字是${myName}`
4.數組
形式1:在元素類型后面接上[],表示由此類型元素組成的一個數組:let list:number[] = [1,2,3]
形式2:使用數組泛型,Array<元素類型> let list:Array<number> = [1,2,3]
定義時的元素類型和賦值時要一致,否則會報錯
5.元組 Tuple
元組類型允許表示一個已知元素數量和類型的數組,各元素的類型不必相同 可以定義一對值分別為string\number類型的元組
注意:1)定義時的類型順序和賦值時應一致,不然會報錯
2)當訪問一個已知索引的元素,會得到正確的類型
3)當訪問一個越界的元素,會使用聯合類型替代
注意:在 Typescript 2.7 Tuple 的定義已經變成了有限制長度的數組 不能再越界訪問了 官方文檔沒更新
push可以成功,訪問數組也能看到這個元素,但是通過索引取不了
索引不能獲取是靜態檢查不讓你獲取而已,實際上運行時還是能的。靜態檢查對運行時不會有任何影響。
typescript的靜態類型並不屬於強類型,就算聲明約束為長度2的數組,它仍然可以push,因為它始終還是js。
所以typescript能做的就是在你盡管對數組的操作超越了約束,它還是限制你繼續在約束范圍外進行其他操作。
let x: [string, number]
x = ['hi', 10] //(2) ["hi", 10]
x = [10, 'jjj'] //error TS2322: Type 'number' is not assignable to type 'string'.
console.log('----', x[0].substr(1)) //i substr(start,length) 如果第二個參數沒傳,默認到最后
console.log(x[1].substr(1)) //類型“number”上不存在屬性“substr”
6.枚舉 enum類型是js標准數據類型的一個補充
1)使用枚舉類型可以為一組數值賦予友好的名字
2)默認情況下,從0開始為元素編號,也可以手動指定成員的數值
enum Color { Red = 1, Green = 2, Blue = 3,}
3)可以由枚舉的值得到它的名字 這里限定數據類型是你前面定義的那個
let c: Color = Color.Green //結果是值
4)知道值 可以以查到映射對應的名字 這里要限定數據類型是string,等號右邊的值是字符串
let e: Color = Color[3] //不能將類型“string”分配給類型“Color”。
let d: string = Color[3]//Blue
enum Color { Red = 1, Green = 2, Blue = 3,}
let c: Color = Color.Green
console.log(c) //2
// let e: Color = Color[3] //不能將類型“string”分配給類型“Color”。
let d: string = Color[3]
console.log(d) //blue
7.Any
為在編程階段還不清楚類型的變量指定一個類型(值可能來自於動態的內容 第三方代碼庫、用戶輸入)
不希望類型檢查器對這些值進行檢查而是直接讓它們通過編譯階段的檢查=》用any類型標記該變量
1)不知道變量是什么數據類型
let notSure: any = 4
console.log(notSure) //4
notSure = 'hhhhhhhhh'
console.log(notSure) //hhhhhhhhh
notSure = false
console.log(notSure) //false
2)改寫現有代碼
允許在編譯時可選擇的包含或移除類型檢查 object類型的變量只允許給它賦任意值 但不能在它上面調用任意的方法 即使它真的有這些方法
let notSure: any = 4
notSure.ifItExisits() //瀏覽器報錯了,vscode沒有 jc1.js:179 Uncaught TypeError: notSure.ifItExisits is not a function
notSure.toFixed() //沒報錯
let prettySure: Object = 4
prettySure.toFixed() //vscode直接報錯 類型“Object”上不存在屬性“toFixed”
3)只知道部分數據的類型時 比如數值包含不同類型的數據
let list: any[] = [1, true, 'free']
list[1] = 100 //vs沒報錯 沒指定數值元素的數據類型
8.Void
void類型與any類型相反,表示 沒有任何類型
1) 當一個函數沒有返回值時,其返回值類型是void
function warnUser(): void {
console.log('message')
}
2)聲明一個void類型的變量沒有大用,只能賦值為undefined null
let unusable: void = undefined
let unusable0: void = null
let unusable1: void = 1 //不能將類型“number”分配給類型“void”。
let unusable2: void = [1, 2] //不能將類型“number[]”分配給類型“void”。
9.null\undefined
1.默認情況下null和undefined是所有類型的子類型,就是說 你可以把null undefined賦值給number類的變量
2.如果指定了 --strictNullChecks標記,null\undefined只能賦值給void和它們各自
如果想傳一個string null 或undefined,可以使用【聯合類型】string|null|undefined
let u:undefined = undefined;
let:null = null;
10.Never
1)表示永不存在的值的類型
--never類型是那些總是會拋出異常或者根本就不會有返回值的函數表達式或箭頭函數表達式的返回值的類型
--變量也可能是never類型,當它們被永不為真的類型保護所約束時
2)never類型是任何類型的子類型,也可以賦值給任何類型
但是,只有never可以賦值給never 沒有類型是never的子類型或可以賦值給never類型(除了never本身之外),any也不可以賦值給never
// 返回never的函數必須存在無法達到的終點
function error(message: string): never {
throw new Error(message)
}
// 推斷的返回值類型為never
function fail() {
return error('Something failed')
}
// 返回never的函數必須存在無法達到的終點 死循環
function infiniteLoop(): never {
while (true) {}
}
11.object
表示非原始類型, 除number string boolean symbol null undefined之外的類型
使用object類型可以更好的表示像Object.create這樣的API
declare function create(o: object | null): void
create({ prop: 0 })
create(null)
// create(3) //類型“number”的參數不能賦給類型“object”的參數。
// create('string') // Error
// create(false) // Error
//和文檔例子不同
create(undefined) // 默認情況下null和undefined是所有類型的子類型
類型斷言
-只在編譯階段起作用 ts會假設你已經進行了必須的檢查
形式1:尖括號語法
let someValue:any = "hihi";
let strLength:number = (<string>someValue).length
形式2: as語法 在ts里使用JSX時,只允許as語法斷言
let someValue:any = 'hhhhh';
let strLength:number = (someValue as string).length;
關於let
用let代替var
