在TypeScript中,提供了一下基本數(shù)據(jù)類型
其中元組组力、枚舉瘟斜、任意值、void類型和 never類型是TypeScript有別與JavaScript的特有類型术陶。
在TypeScript中聲明變量凑懂,需要加上類型聲明,例如boolean和string等梧宫。通過靜態(tài)類型約束接谨,在編譯時(shí)執(zhí)行類型檢查,可以避免一些類型混用的低級(jí)錯(cuò)誤塘匣。
布爾類型
布爾類型是最簡(jiǎn)單的數(shù)據(jù)類型脓豪,只有true和false兩種值。下面定義了一個(gè)布爾類值的變量flag忌卤,并賦值為true扫夜。由于flag被初始化為布爾類型,如果再賦值為非boolean的其他類型值驰徊,編譯時(shí)會(huì)拋出錯(cuò)誤笤闯。
let flag:boolean = true;
flag = 1; //報(bào)錯(cuò),不能把數(shù)字類型的值賦給布爾類型的變量棍厂。
數(shù)字類型
在TypeScript中颗味,數(shù)字都是浮點(diǎn)型。TypeScript同時(shí)支持二進(jìn)制勋桶、八進(jìn)制脱衙、十進(jìn)制和十六進(jìn)制字面量侥猬,示例代碼如下:
let binaryLiteral:number = 0b1010;//二進(jìn)制
let octalLiteral:number = 0o744;//八進(jìn)制
let decLiteral:number = 6;十進(jìn)制
let hexLiteral:number = 0xf00d;//十六進(jìn)制
字符串類型
TypeScript支持使用單引號(hào)(‘)或者雙引號(hào)(“)來表示字符串類型。除此之外捐韩,還支持使用模版字符串反引號(hào)(`)來定義多行文本和內(nèi)嵌表達(dá)式退唠。使用${expr}的形式嵌入變量或者表達(dá)式,在處理拼接字符串的時(shí)候很有用荤胁,示例代碼如下瞧预。
let name: string = "Angular";
let years:number = 5;
let words:stirng = `你好,今年是${name}發(fā)布${years+1}周年`;
數(shù)組類型
TypeScript像JavaScript一樣可以操作數(shù)組元素仅政。 有兩種方式可以定義數(shù)組垢油。
第一種,可以在元素類型后面接上 []圆丹,表示由此類型元素組成的一個(gè)數(shù)組:
let list: number[] = [1, 2, 3];
第二種方式是使用數(shù)組泛型滩愁,Array<元素類型>:
let list: Array<number> = [1, 2, 3];
元組類型
元組類型用來表示已知元素?cái)?shù)量和類型的數(shù)組,各元素的類型不必相同辫封,下面定義了一對(duì)值分別為字符串和數(shù)字類型的元組硝枉。
let x:[string,number];
x = ["Angular",24];
x = [10,"Angular"];//報(bào)錯(cuò)
console.log(x[0]); //輸出Angular
枚舉類型
枚舉是一個(gè)可被命名的整型常數(shù)的集合,枚舉類型為集合成員賦予有意義的名稱倦微,增強(qiáng)可讀性妻味。
enum Color {Red, Green, Blue}
let c: Color = Color.Blue;
console.log(c);//輸出:2
枚舉默認(rèn)下標(biāo)是0,可以手動(dòng)修改默認(rèn)下標(biāo)值
enum Color {Red=2, Blue, Green=6}
let c: Color = Color.Blue;
console.log(c);//輸出:3
任意值類型
任意值是TypeScript針對(duì)編程時(shí)類型不明確的變量使用的一種數(shù)據(jù)類型欣福,它常用于以下二種情況责球。
① 變量的值動(dòng)態(tài)變化時(shí),比如來自用戶的輸入或者第三方代碼庫拓劝,任意值類型可以讓這些變量跳過編譯階段的類型檢查
let x:any = 1;//數(shù)字類型
x = "I am a string"; //字符串類型
x = false; //布爾類型
② 定義存儲(chǔ)各種類型數(shù)據(jù)的數(shù)組時(shí)
let arrayList:any[] = [1,falses,"fine"];
arrayList[1] = 100;
Void
function warnUser(): void {
alert("This is my warning message");
}
聲明一個(gè)void類型的變量沒有什么大用雏逾,因?yàn)槟阒荒転樗x予undefined和null:
let unusable: void = undefined;
let unusable: void = null;
Null 和 Undefined
TypeScript里,undefined和null兩者各自有自己的類型分別叫做undefined和null凿将。 和 void相似校套,它們的本身的類型用處不是很大:
let u: undefined = undefined;
let n: null = null;
undefined 類型的變量只能被賦值為 undefined,null 類型的變量只能被賦值為 null牧抵。
與 void 的區(qū)別是笛匙,undefined 和 null 是所有類型的子類型。也就是說 undefined 類型的變量犀变,可以賦值給 number 類型的變量妹孙,但是盡量不要這么用。
// 這樣不會(huì)報(bào)錯(cuò)
let num: number = undefined;
// 這樣也不會(huì)報(bào)錯(cuò)
let u: undefined;
let num: number = u;
而 void 類型的變量不能賦值給 number 類型的變量:
let u: void;
let num: number = u;
// index.ts(2,5): error TS2322: Type 'void' is not assignable to type 'number'.
類型推論
如果沒有明確的指定類型获枝,那么 TypeScript 會(huì)依照類型推論(Type Inference)的規(guī)則推斷出一個(gè)類型蠢正。
以下代碼雖然沒有指定類型,但是會(huì)在編譯的時(shí)候報(bào)錯(cuò):
let myFavoriteNumber = 'seven';
myFavoriteNumber = 7;
// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.
事實(shí)上省店,它等價(jià)于:
let myFavoriteNumber: string = 'seven';
myFavoriteNumber = 7;
// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.
聯(lián)合類型
聯(lián)合類型(Union Types)表示取值可以為多種類型中的一種嚣崭。
let myFavoriteNumber: string | number;
myFavoriteNumber = 'seven';
myFavoriteNumber = 7;
let myFavoriteNumber: string | number;
myFavoriteNumber = true;
// index.ts(2,1): error TS2322: Type 'boolean' is not assignable to type 'string | number'.
// Type 'boolean' is not assignable to type 'number'.
聯(lián)合類型使用 | 分隔每個(gè)類型笨触。
這里的 string | number 的含義是,允許 myFavoriteNumber 的類型是 string 或者 number雹舀,但是不能是其他類型芦劣。
聯(lián)合類型的屬性或方法
當(dāng) TypeScript 不確定一個(gè)聯(lián)合類型的變量到底是哪個(gè)類型的時(shí)候,我們只能訪問此聯(lián)合類型的所有類型里共有的屬性或方法:
function getLength(something: string | number): number {
return something.length;
}
// index.ts(2,20): error TS2339: Property 'length' does not exist on type 'string | number'.
// Property 'length' does not exist on type 'number'.
上例中说榆,length 不是 string 和 number 的共有屬性媒惕,所以會(huì)報(bào)錯(cuò)录粱。
訪問 string 和 number 的共有屬性是沒問題的:
function getString(something: string | number): string {
return something.toString();
}
聯(lián)合類型的變量在被賦值的時(shí)候洁奈,會(huì)根據(jù)類型推論的規(guī)則推斷出一個(gè)類型:
let myFavoriteNumber: string | number;
myFavoriteNumber = 'seven';
console.log(myFavoriteNumber.length); // 5
myFavoriteNumber = 7;
console.log(myFavoriteNumber.length); // 編譯時(shí)報(bào)錯(cuò)
// index.ts(5,30): error TS2339: Property 'length' does not exist on type 'number'.
上例中淹朋,第二行的 myFavoriteNumber 被推斷成了 string,訪問它的 length 屬性不會(huì)報(bào)錯(cuò)唱蒸。
而第四行的 myFavoriteNumber 被推斷成了 number邦鲫,訪問它的 length 屬性時(shí)就報(bào)錯(cuò)了。