typescript 支持校驗 JavaScript 數據類型,比如 number、boolean、string…可以讓我們在寫程序時清晰地看見各個對象的類型,更規範地編寫,更方便地定位錯誤。
比如這樣操作:
let bo: boolean = false;
let num: number = 4;
let name: string = "lisi";
定義數組
- 在元素類型後面加[],表示由此類型元素組成的一個數組
let arr: number[] = [1, 2, 3, 4];
- 數組泛型,Array<元素類型>
let arr: Array<number> = [1, 2, 3, 4];
定義元組類型
元組類型表示一個已知元素數量和類型的數組,各元素類型可以不同,表示數組中對應位置對應元素的類型。不可設置越界元素。
let arr: [string, number] = ["hello", 5];
console.log(arr[0]); //hello
arr[2] = 4; //報錯
定義枚舉類型
使用枚舉類型可以爲數組賦值名稱。我們可以把 enum 當成數組來看,Color.Green 默認得到的是索引(0,1,2),可以自定義枚舉值,使用枚舉值能夠獲取枚舉名稱。
enum Color {Red, Green, Blue}
let c: Color = Color.Green; // 1
自定義枚舉值:
enum Color {Red = 1, Green , Blue = 'hello'}
let c: Color = Color.Green;
通過枚舉值查找枚舉名稱:
enum Color {Red = 1, Green, Blue}
let colorName: string = Color[2];
alert(colorName); // 'Green'
定義聯合類型
當使變量可以設置爲多種數據類型時,可以使用|來操作,意思是可以接收被設置的這幾種類型。例如,a 可以是 string 類型也可以是 number 類型。
let a: string | number = 23; // 這時a可以是字符串也可以是數字
這裏需要注意的是使用聯合類型時對其他定義類型的影響,例如:
function min(num1: number, num2: number | string): number {
if (num1 < num2) {
return num1;
}
return num2; // 報錯
}
在這裏 num2 是聯合類型可以接收數字和字符串,但是 min 返回值是 number,所以要將返回值也設置成聯合:
function min(num1: number, num2: number | string): number | string {
if (num1 < num2) {
return num1;
}
return num2; // 報錯
}
或者使用 any 類型,意思是接收任意類型數據:
function min(num1: number, num2: number | string): any {
if (num1 < num2) {
return num1;
}
return num2; // 報錯
}
定義任意值類型
有時候我們不知道變量是什麼類型,或者不希望 typescript 檢測這些值,就可以使用 any :
let data: any; //data可以是任意類型
前面講了元組類型不能設置越界元素,如果將數組設置爲 any 類型,則可以設置越界元素接收任意類型的數值:
let newArr: any = [1, "3", true];
newArr[3] = "abc";
console.log(newArr); // [ 1, '3', true, 'abc' ]
void 類型
any 類型代表什麼都接收,那麼 void 類型就是它的對立面了,表示什麼都沒有,它只能接收 undefined 和 null。例如:
let unusable: void = undefined; // 也可以賦值爲null
對函數設置 void 類型則表示該函數沒有返回值,不應該 return 除了 undefined\null 以外的任何值,空值也不可以:
function test(): void {
return 123; // 報錯
}
null\undefined 類型
null\undefined 相當於 void 的子集,驗證一個 null 或者 undefined 的值。
never 類型
never 類型是任何類型的子類型,代表從不會出現的值,在函數中它通常表現爲拋出異常或無法執行到終止點(例如無限循環)。
// 運行正確,never 類型可以賦值給 never類型
let x: never = (() => {
throw new Error("exception");
})();
// 運行正確,never 類型可以賦值給 數字類型
let y: number = (() => {
throw new Error("exception");
})();
function error(message: string): never {
throw new Error(message);
}
// 返回值爲 never 的函數可以是無法被執行到的終止點的情況
function loop(): never {
while (true) {}
}
類型斷言
類型斷言可以用來手動指定一個值的類型:允許變量從一種類型更改爲另一種類型。使用<類型>值或者 值 as 類型格式。當 S 類型是 T 類型的子集,或者 T 類型是 S 類型的子集時,S 能被成功斷言成 S。這是爲了在進行類型斷言時提供額外的安全性,完全毫無根據的斷言是危險的,如果你想這麼做,你可以使用 any。
str 初始是字符串,執行<any>str
語句將 string 類型斷言爲 any 類型,此時 any 類型再斷言爲 number 類型,string 類型不能直接被斷言爲 any 類型,可以認爲 any 類型裏包含 number 類型,而 string 補包含。
let str:string = "1";
let str2: number = <number>(<any>str);
console.log(typeof str2); // string
str3 初始設置爲 any 類型,即 str3 爲任意類型。當執行str2 as string
語句後,str3 就爲 string 類型。
let str3: any = "string";
let strLength: number = (str3 as string).length; // 將str斷言爲string類型
console.log(strLength) // 6
在使用聯合類型過程中使用斷言:
function foo(data: number | string): void {
if ((data as string).length) {
console.log(`one: + ${typeof data} + ${data}`);
} else {
console.log(`two: + ${typeof data} + ${data}`);
}
}
foo(1); // two: + number + 1
foo("a"); // one: + string + a
斐波拉切 DOME
function fibo(max: number | string): number[] {
let b: number[] = [];
if ((max as string).length) {
max = Number(max);
}
for (let i = 0; i < max; i++) {
if (i < 2) {
b.push(1);
} else {
b.push(b[b.length - 1] + b[b.length - 2]);
}
}
return b;
}
console.log(fibo("10"));