本系列目的: 列出TypeScript與JavaScript的不同點, 縮小文件內容, 提高學習速度. 原文件地址: https://www.tslang.cn/index.html

型別推論

基本

let x = 3; // 推斷x為數字

let zoo = [new Rhino(), new Elephant(), new Snake()]; // 推斷為聯合陣列型別 (Rhino | Elephant | Snake)[]

型別相容性

一. typeScript裡的型別相容性是基於結構子型別的。 結構型別是一種只使用其成員來描述型別的方式. typeScript裡的型別相容性是基於結構子型別的。 結構型別是一種只使用其成員來描述型別的方式.

// 例1:
interface Named {
    name: string;
}

let x: Named;
let y = { name: 'Alice', location: 'Seattle' };
x = y;

這裡要檢查y是否能賦值給x,編譯器檢查x中的每個屬性,看是否能在y中也找到對應屬性。 在這個例子中,y必須包含名字是name的string型別成員。y滿足條件,因此賦值正確。


二.

// 例2
let x = (a: number) => 0;
let y = (b: number, s: string) => 0;

y = x; // OK
x = y; // Error

要檢視x是否能賦值給y,首先看它們的引數列表。 x的每個引數必須能在y裡找到對應型別的引數。 注意的是引數的名字相同與否無所謂,只看它們的型別。 這裡,x的每個引數在y中都能找到對應的引數,所以允許賦值。

第二個賦值錯誤,因為y有個必需的第二個引數,但是x並沒有,所以不允許賦值。


三.
列舉型別與數字型別相容,並且數字型別與列舉型別相容。不同列舉型別之間是不相容的。比如,

// 例3
enum Status { Ready, Waiting };
enum Color { Red, Blue, Green };

let status = Status.Ready;
status = Color.Green;  // Error

四.
類與物件字面量和介面差不多,但有一點不同:類有靜態部分和例項部分的型別。 比較兩個類型別的物件時,只有例項的成員會被比較。 靜態成員和建構函式不在比較的範圍內。

class Animal {
    feet: number;
    constructor(name: string, numFeet: number) { }
}

class Size {
    feet: number;
    constructor(numFeet: number) { }
}

let a: Animal;
let s: Size;

a = s;  // OK
s = a;  // OK

這兩節感覺挺無聊的就放在一起寫了, 詳情請見https://www.tslang.cn/docs/handbook/type-compatibility.html