型別(TypeScript)
JavaScript大致分為
原始資料型別
物件型別
2018-02-16 TypeScriptの型入門 #TypeScript - Qiita
原始資料型別
: boolean
布林值
但使用new Boolean()建構式的物件不是boolean值
呼叫Boolean()本身則會回傳boolean值
: number
數值
: string
字串
: void/: never
空值
沒有返回任何值的函式
code:typescript
function alertName(): void {
alert('Hello world.');
}
用於變數上則沒有什麼用,因為變數只能賦值為undefined或null
: null和: undefined
undefined和null為所有型別的子型別
使用undefined宣告的變數,可以賦值給number型別的變數
void則否
若有加入--strictNullChecks則無法使用null與undefined
任意值
: any
可以在賦值過程中改變為任意型別
普通型別不可在賦值過程改變型別
允許存取任何屬性或函式
未宣告型別的變數會被識別為任意值型別
let something; = let something: any;
型別推論(TypeScript)
聯合型別
可為多種型別的其中一種
使用|分隔每個型別
: string | number
只能存取聯合型別所共有的屬性或方法
例如length不是string和number的共有屬性,試圖存取時就會造成錯誤
介面
用於定義物件的型別
使用interface定義介面,並使用該介面定義變數
code:typescript
interface Person {
name: string;
age: number;
}
let tom: Person = {
name: 'Tom',
age: 25
}
變數的屬性不可多於或少於所定義的介面中的數量
可選屬性
如果想要彈性定義,則需於屬性名稱後方加上?
age?: number
任意屬性
[propName: string]: any
唯讀屬性
只能在物件建立時賦值
而非第一次賦值給唯讀屬性時
於屬性名稱前方加上readonly
readonly id: number
陣列
: string[]
最簡單的方法:型別+[]
陣列元素不可包含其它型別
Array<elemType>
泛型
interface
介面
code:typescript
interface NumberArray {
index: number: number;
}
let fibonacci: NumberArray = 1, 1, 2, 3, 5;
類陣列也需要使用介面定義
常用的例如IArguments、NodeList、HTMLCollection也都是使用介面定義
使用any則可在陣列中加入任意型別的元素
let list: any[] = ['1', 2, { index: 3 }]
函式
函式宣告
function sum(x, y)
定義較為簡單
function sum(x: number, y: numbebr): number
函式表達式
let sum = function(x, y)
let sum: (x: number, y: number) => number = function (x: number, y: number): number
TypeScript中的=>表示函式定義
需注意不可與ES6的箭頭函式混淆
左邊為輸入型別,使用括號包起來
右邊為輸出型別
介面
code:typescript
interface SearchFunc {
(source: string, subString: string): boolean
}
可選參數
與介面相同,於參數名稱後方加上?
可選參數之後不可再接上必需參數
參數預設值
TypeScript會將帶有預設值的參數視為可選參數
code:typescript
function buildName(firstName: string = 'Tom', lastName: string)
此時則不受必須接在必需參數後的限制
解構參數
ES6可使用...取得解構參數
此解構參數為陣列,故可使用陣列型別進行定義
function push(array: any[], ...items: any[])
此解構參數必須為最後一個參數
過載
允許函式接受不同數量或型別的參數
雖然使用聯合型別也可以達成,但會有表達不精確的問題
code:typescript
function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string { ... }
透過多次重複定義,可以明確提示如輸入為數值時,輸出也應該為數值
內建物件
https://github.com/Microsoft/TypeScript/tree/master/src/lib
別名
type
元組
Tuple
包含不同型別的物件
let tom: [string, number] = ['Tom', 25]
可只賦值其中一個元素
tom[0] = 'Tom'
初始化或賦值變數本身時,則需提供所有元素
tom = ['Tom', 25]
新增多於定義的元素時,其型別會受限制於既有的聯合型別內
列舉
Enum
enum
code:typescript
enum Color {Red, Green, Blue};
let v_enm: Color = Color.Green;
constant member
computed member
Ambient Enums
類別
指定類別名稱
class
code:typescript
class MyClass { name: string; }
var val_class: MyClass = new MyClass();
泛型
Generics
定義時不預先指定具體的型別,在使用時再進行指定
物件
: object