typescript 初探之基礎類型附ts式求斐波拉切數列

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"));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章