1. 程式人生 > 實用技巧 >typescript資料型別

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裡,undefinednull兩者各自有自己的型別分別叫做undefinednull

let a:null=null
let b:undefined=undefined

但是,預設情況下nullundefined

是所有型別的子型別.也就是說你可以把它們賦值給任何型別的資料.包括後面要講的幾種資料型別.


不是說資料型別要分清除嗎?怎麼到這裡就不分了.這裡主要是設計到幾個場景,比如我定義了,但是沒賦值.那我得給他一個預設值吧?無論他是什麼型別的,我都給了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表示非原始型別,也就是除numberstringbooleansymbolnullundefined之外的型別。

使用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中的資料型別,明顯的多出來好幾種資料型別.不過大類還是基礎資料型別和非基礎資料型別.而非基礎資料型別又是建立在基礎資料型別之上的,所有非基礎資料型別的資料分類還是建立在基礎資料型別上的.