typescript資料型別
ts中資料型別的定義是重點之一,所以必須明確ts有哪些資料型別
1.布林型別
最基本的資料型別就是簡單的true/false值,在JavaScript和TypeScript裡叫做boolean
(其它語言中也一樣)。
let isDone: boolean = false;
注意:在js中,除了false和true.,比如:true可以用其他的資料型別的資料去替換而實現統樣的效果,所以我們常常並沒有特意去計較它是不是真的布林值.比如
var a=true if(a){ console.log(a) } a=1 if(a){ console.log(a) }
而ts中則不允許非同型別的資料進行賦值,後續的隱患就少了很多
2.數值(數字)型別
和JavaScript一樣,TypeScript裡的所有數字都是浮點數。 這些浮點數的型別是 number
。 除了支援十進位制和十六進位制字面量,TypeScript還支援ECMAScript 2015中引入的二進位制和八進位制字面量。
let decLiteral: number = 6; let hexLiteral: number = 0xf00d; let binaryLiteral: number = 0b1010; let octalLiteral: number = 0o744;
對比與js,絕大部分的資料型別轉換的方式,只要等號右邊的返回值是數值都可以,但並不是所有,至少有一個(true-1)不能用於給ts中的number型別變數賦值
3.字串
let a:string='6' let b:boolean=true a=7+'' a=b.toString()
基本的轉化也能拿來賦值.同時也允許模板字串賦值
leta:string='6' letb:string='你真是' letc:string=`我覺得${b}${a}${a}的`4.null和undefined
TypeScript裡,undefined
和null
兩者各自有自己的型別分別叫做undefined
和null
let a:null=null let b:undefined=undefined
但是,預設情況下null
和undefined
不是說資料型別要分清除嗎?怎麼到這裡就不分了.這裡主要是設計到幾個場景,比如我定義了,但是沒賦值.那我得給他一個預設值吧?無論他是什麼型別的,我都給了undefined,null也是類似的初始化作用.
當然,如果你就是想明確一點,畢竟有時候null和undefined也會對專案造成不可預估的影響,也是有手段的.在編譯生成js程式碼的時候輸入下面的程式碼
tsc [filename] --strictNullChecks
5.陣列
TypeScript像JavaScript一樣可以運算元組元素。 有兩種方式可以定義陣列。 第一種,可以在元素型別後面接上 []
,表示由此型別元素組成的一個數組
let list: number[] = [1, 2, 3];
第二種方式是使用陣列泛型,Array<元素型別>
:
let list: Array<number> = [1, 2, 3];
可以明顯的看出,無論哪種方式,都定義了元素的資料型別.所以,只要是符合定義的元素,無論string,number,boolean,只要是單一的型別,都是可以在數組裡的.但是隻要存在不符合的就報錯
6.元組.
如果說陣列是單一型別的元素組成的陣列,那元祖就包括除此之外的陣列
let a:[string,number];
a=['1',1]
申明與賦值規則如下
(1)定義時,每個位置上的元素資料型別都必須宣告.同時賦值時要一一對應
(2)申明時的資料型別申明不會改變,所以在淺拷貝時也會先驗證拷貝物件是否符合當前申明,不符合不給拷貝.
注意:官網有說可以越界查詢.所有後續需要再確認一下
但我在實際試驗的時候,並不能越界.具體原因後續再調查
7.列舉
enum
型別可以用js的思路理解為一個物件,物件裡的每個屬性值都是這個型別的值,比如
enum Color {Red, Green, Blue}
let c: Color = Color.Green;
但是,它自己本身不能作為值被賦予
數值:具體的數值部分要討論的情況比較麻煩,單獨開一篇.這裡就講預設情況
(1)預設狀態,預設從0開始,後續屬性+1
8.Any(可變的,可以是任何資料型別)
有時候,有些資料型別確實是不確定的,特別是第三方的資料.有時候是數值,有時候是字串.這時候給它一個Any型別,就可以解除編譯校驗,讓程式碼順利執行.
9.void
(不能是任何型別)
一般沒有返回值的函式它的返回值是void型別,不過注意,undefined和null可以作為值賦予它
10.Never(從不,沒有完結的,無法到達的)
void型別是沒有返回值的函式返回的,但有一個問題,假如這個函式執行不完呢?不就不知道有沒有返回值了,此時void就不合適了.這個函式的返回值就是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
object
表示非原始型別,也就是除number
,string
,boolean
,symbol
,null
或undefined
之外的型別。
使用object
型別,就可以更好的表示像Object.create
這樣的API.
declare function create(o: object | null): void; create({ prop: 0 }); // OK create(null); // OK create(42); // Error create("string"); // Error create(false); // Error create(undefined); // Error
12.型別斷言
這個準確來說不是一種資料型別,而是類似資料轉換.也就是說,你前面給某個資料定好型別了,但是後面明確了它是另一種型別,這時候就可以使用型別斷言告訴ts,你不用在這裡限制我了,我知道自己在做啥,我先轉換,然後你再監聽.在舉例子之前我們先要明白一點,'訪問聯合型別值的屬性時,這個屬性必須是所有可能型別的共有屬性'.什麼意思呢?比如:
當建立函式的時候,val定義的資料型別是既有可能是string,又有可能是number,而number.length是錯誤的,不存在的.所以ts就會提醒你"程式設計師,你這裡寫的是不是有問題?"
那麼這時候用型別斷言,就是告訴ts,這裡使用.length的時候是string型別的,我知道.換句話說,你也可以理解成一種型別選擇,if(val的型別是string)就.length.
以上差不多就是ts的資料型別了.因為ts算是'強資料型別'.所有為了涵蓋所有js中的資料型別,明顯的多出來好幾種資料型別.不過大類還是基礎資料型別和非基礎資料型別.而非基礎資料型別又是建立在基礎資料型別之上的,所有非基礎資料型別的資料分類還是建立在基礎資料型別上的.