TypeScript 型別推斷

admin發表於2019-04-29

TypeScript中,有些資料沒有明確指定型別,但是可以通過型別推斷給出型別。

程式碼例項如下:

[JavaScript] 純文字檢視 複製程式碼
let str="螞蟻部落";

上面程式碼中,str會被推斷為string型別資料,截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201904/29/112204sr4xv2dwv442ewt9.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

型別發生在初始化變數和成員,設定預設引數值和決定函式返回值時。

當要從幾個表示式中推斷型別時候,會從這些表示式的型別來推斷出一個最合適的通用型別。

也就是對所有的成員都是適合的,程式碼例項如下:

[typescript] 純文字檢視 複製程式碼
let arr = [0, 1, null];

陣列成員中,除了數字還有一個null,型別並不完全一致,那麼就要推斷出一種相容所有資料的型別。

在預設情況下null是其他所有型別的子型別,所以number型別是最佳型別,截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201904/29/112443f90ry68ack3gaacy.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

如果在tsconfig.json檔案中設定strictNullChecks為true,那麼推斷型別就變為聯合型別。

截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201904/29/112501zz3v981u36rgs7cm.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

關於null型別可以參閱TypeScript Null和Undefined 型別一章節。

通用型別取自候選型別,有時候選型別共享相同的通用型別,但卻沒有一個型別能做為所有候選型別的通用型別。

看如下程式碼例項:

[typescript] 純文字檢視 複製程式碼
interface IAnimal{
  leg:number;
  color:string;
}
 
class Bird{
  leg=2;
  color="white";
  fly(){
    // code
  }
}
class Insect {
  leg=8;
  color="black";
  eat(){
    // code
  }
}
 
let antzone = [new Bird(), new Insect()];

Bird和Insect型別任何一個都不能相容所有其他型別,這時候被推斷出聯合型別。

程式碼如下:

a:3:{s:3:\"pic\";s:43:\"portal/201904/29/112533tc250skh5vr5v0rc.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

這和第一個程式碼例項是一樣的,我們也可以顯式的指定陣列的型別為IAnimal。

程式碼如下:

[typescript] 純文字檢視 複製程式碼
let antzone:IAnimal[] = [new Bird(), new Insect()];

也可以按照上下文推斷型別,程式碼例項如下:

[typescript] 純文字檢視 複製程式碼
let antzone = function(webName: string, age: number): string {
  return webName+"已經成立"+age+"年了";
}

上面程式碼可以由右邊推斷出antzone的型別為:

[typescript] 純文字檢視 複製程式碼
(webName:string, age:number) => string

再來看一段程式碼例項:

[typescript] 純文字檢視 複製程式碼
let antzone: (webName:string, age:number) => string=
    function(name, webAge){
      return name+"已經成立"+webAge+"年了";
    }

由左到右推斷型別。

相關文章