// boolean 布林
let isUserExists: boolean = false;

// Number 數值
let myAge: number = 26;

// String 字串
let jobTitle: string = 'Frontend Engineer';

// String 也可以用 字串樣板 (Template Literals) ${ expr }
let API_STEM: string = 'http://api.xxx.xx?';
let API_KEY: string = 'SK935232fwgw'; // 我亂打的 示意一下而已
let API_URL = `${API_STEM}KEY=${API_KEY}`;

// Array 陣列
// 如數字型別的陣列
let luckyNumber: number[] = [12, 17, 27, 46, 33, 11];
// 也可以用 泛型 來表示一個 Array Type
let list: Array<number> = [12, 17, 27, 46, 33, 11];

// Tuple 元組,定義一個固定數量且已知型別的 array
// 定義一個 Tuple
let userNameAndAge: [string, number];

// 正確的初始化 init 示範:
userNameAndAge = ["win wu", 520];

/* 錯誤的初始化像是故意把數字跟字串相反:
 * userNameAndAge = [520, "winwu"];
 * 會得到錯誤訊息
 * basic.ts(27,1): error TS2322:
 * Type '[number, string]' is not assignable
 * to type '[string, number]'.
 */


// Enum 列舉
enum Book {
  PHP,
  ROR,
  Node};
let p: Book =  Book.PHP;

/* 預設情況下 Enum 第一個 index 是 0
 * 但你可以調整,若希望第一個從 1 開始:
 */

enum Color1 {Pink, Yellow, Green };
let colorName1: String = Color1[1];
alert(colorName1); // print “Yellow”


enum Color2 {Pink = 1, Yellow, Green };
let colorName2: String = Color2[1];
alert(colorName2); // print “Pink”


// Any 任意型別 可以調用任意方法
/* 有時候我們在開發的時候可能還無法決定該變數的型別
 * 或是這個資料的內容是動態的
 */

let notSureData: any = 4;
notSureData = false;


// Void 無資料 return 時或undefined
let unUseable: void = undefined;

function doNothing(): void {
  return undefined;
}