TypeScript 混合型別介面

admin發表於2018-07-30

在前面的文章已經介紹,介面可以描述函式、物件的方法或者物件的屬性。

有時希望一個物件同時具有上面提到多種型別,比如一個物件可以當做函式使用,同時又具有屬性和方法。

程式碼例項如下:

[typescript] 純文字檢視 複製程式碼
interface Counter {
  (start: number): string;
  interval: number;
  reset(): void;
}

function getCounter(): Counter {
  let counter = <Counter>function (start: number) { };
  counter.interval = 123;
  counter.reset = function () { };
  return counter;
}

let c = getCounter();
c(10);
c.reset();
c.interval = 5.0;

下面對程式碼進行一下分析:

[typescript] 純文字檢視 複製程式碼
interface Counter {
  (start: number): string;
  interval: number;
  reset(): void;
}

宣告一個介面,如果只有(start: number): string一個成員,那麼這個介面就是函式介面,同時還具有其他兩個成員,可以用來描述物件的屬性和方法,這樣就構成了一個混合介面。

[typescript] 純文字檢視 複製程式碼
function getCounter(): Counter {
  // code
}

建立一個函式,它的返回值是Counter型別的。

[typescript] 純文字檢視 複製程式碼
let counter = <Counter>function (start: number) { };

通過型別斷言,將函式物件轉換為Counter型別,轉換後的物件不但實現了函式介面的描述,使之成為一個函式,還具有interval屬性和reset()方法。斷言成功的條件是,兩個資料型別只要有一方可以賦值給另一方,這裡函式型別資料不能賦值給介面型別的變數,因為它不具有interval屬性和reset方法;那只有介面型別資料賦值給函式型別變數是成立的,也就是:

[typescript] 純文字檢視 複製程式碼
(start: number): string;

具有此簽名和返回值的函式可以賦值給如下簽名和返回值的函式:

[typescript] 純文字檢視 複製程式碼
(start: number) : void

特別說明:函式簽名相同,返回值非void型別的函式可以賦值給返回值是void型別的函式。

相關文章