TypeScript(2) - 函式宣告、函式型別與物件

基本宣告方式

函式本身的型別宣告可能在幾個地方發生,分別是參數跟回傳值:

function multiply(value1: number, value2: number): number{
    return value1*value2
} 

console.log(multiply(2,3)); //6

當然也可以像JS原本的宣告方式一樣,如此一來預設的類型會是Any,不過這樣使用TS就失去意義:

let myName:string = 'Moojing'
function returnMuyName (){
    return myName;
} 

函式型別

JS 裡面,我們可以把 function assign 給變數,但是 TypeScript 裡面想要啟用型別檢查,就一樣必須在變數後面聲明這個函式的型別,(包含參數和回傳值),但如果一個變數沒有任何型別的話,這個 function 的型別跟一般變數一樣會被設為 any ,所以可以傳入型別。

function sayHello():void{
    console.log('Hello')
} 

function multiply(value1:number,value2:number): number{
    return value1*value2
} 

let doSomeThing = sayHello;
let doSomeThing = multiply;

但是這樣一來我們就無法直觀的判斷這個變數的型別,畢竟使用TS就是要將他的優點發揮到極致,還記得之前我們提過變數型別的宣告嗎?我們可以這麼做:

let doSomeThing: (val1: number, val2: number)=>number;
    doSomeThing = multiply;
    doSomeThing = sayHello;// Type '() => void' is not assignable to type '(val1: number, val2: number) => number'.

這樣一來在assign錯誤的函式型別時,TS就能夠檢查出錯誤,不過這樣一來函式的宣告就變得有點的雜亂不易閱讀,這時我們可以使用 type 關鍵字把函式型別抽出來另外宣告

    
    type someType = (val1: number, val2: number)=>number; 

物件型別

將物件assign給某變數,該變數的型別宣告方式,其實跟前面function型別的宣告方法差不多:

let userData : {name: string, age: number}= {
    name: "Max", 
    age:27
}

宣告完物件型別之後,就不能再assign該物件型別裡沒有定義的property跟類型:

userData = {
    a:'hello', //類型 '{ a: string; b: number; }' 不可指派給類型 '{ name: string; age: number; }'。
    b:22
}
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×