1. 程式人生 > 其它 >TypeScript - 型別

TypeScript - 型別

// ts 檔案中完全可以寫js語法, 完全相容js
// ts 本身在執行時,會轉化為js檔案,從而執行
// ts 可以在定義變數的時候,確認他的型別,防止賦予不同型別的值

// 型別都要小寫
/**
 型別有 number, string, boolean, object, any(任意型別), unknown(型別安全的any), void(空置 undefined), never(沒有值), array, tuple(TS新增型別,固定長度的陣列), enum(TS新增型別, 列舉型別)
**/
// 宣告一個變數,同時指定型別為number
let a : number;

// 因為a型別已設定,所以只能賦值數字
a = 10; a = 20; // a = 'hellow' //因為型別不是number,所以會報錯 // 宣告完變數直接賦值 let b : boolean = false; // js中函式是不考慮引數的型別和個數 function sum(a, b){ return a + b; } console.log(sum(123, 456)); // 579 console.log(sum(123, '456')); // '123456' // ts 引數可以增加型別,同時函式本身的返回值也可以定義型別 function sum_(a: number, b: number): number{
// return a + b + 'hello; // 報錯 return a + b; } console.log(sum_(123, 456)); // 579 // console.log(sum_(123, '456')); // 報錯 Argument of type 'string' is not assignable to parameter of type 'number' // object 標記JS物件, 在ts中不實用,因為 物件是物件, 方法還是物件, 物件太多了,沒做太多限制 /** {} 用來指定物件中可以包含的屬性 語法: {key: value, key: value} 在屬性名後增加?, 表示屬性是可選的, 可以不用賦值 *
*/ // 所以一般如下實用 let c : {name: string}; // 有且只有一個屬性 // c = {}; // 報錯,未定義name c = {name: 'Alan'} // c = {name: 'Alan', age: 18} // 報錯,因為沒有定義age屬性,所以c定義的時候,可以固定物件的結構,key值 // 同時,在屬性名後增加?, 表示屬性是可選的, 可以不用賦值 let d : {name: string, age?: number}; // name 強制,age可選 d = {name: 'Alan'}; d = {name: 'Alan', age: 12}; // 如果想要不限制任意屬性,則需要 增加任意型別的屬性 let e : {name: string, [propName: string]: any}; // propName不固定,可隨意寫 e = {name: 'Alan', age: 18, dob: 19901120} // 通過箭頭函式,來設定函式結構的型別宣告 // 語法: (形參: 型別, 形參: 型別 ...) => 返回值 let f:(a: number, b:number) => number; f = function (n1, n2):number { // 如果在此處定義n1為不是number的型別,則同樣會報錯 return n1 + n2; } // 陣列型別 // string [] 字串陣列 // number [] 數字陣列 or Array<number> // any [], Array<any> 任意陣列,但是不建議用any /** * tuple 元組 固定長度的陣列 * 長度固定後,儲存效率高,變化機率小一點 * 語法: [型別, 型別, 型別] 不會太多,太多直接用陣列 */ let h: [string, string, number]; h = ['hello', 'word', 123]; /** * enum 列舉 * */ enum Gender { Male, // Male = 0, Female, // Female = 1, } let i: {name: string, gender:Gender} i = {name: 'Alan', gender: Gender.Male}; console.log(i.gender === Gender.Male); /** * & 表示同時 */ let j: {name: string} & {age: number}; j = {name: 'Alan', age: 18} // 必須存在兩個屬性 /** * 型別的別名. * 簡化型別 */ type myType = 1 | 2 | 3 | 4 | 5; let k: 1 | 2 | 3 | 4 | 5; let l: myType; let m: myType; k = 5; k = 3;