3

我試圖繼承基本接口IScreen將IModal,IEmbedded或ITab擴展,並鎖定方法,以便它們特定於接口。但是會發生什麼是public OpenModal(modal: IModal)方法由於某種原因接受任何類型。爲什麼一個接口參數允許任何類型

Playground

namespace Framework { 
    "use strict"; 

    interface IScreen { } 
    interface IModal extends IScreen { } 
    interface ITab extends IScreen { } 
    interface IEmbedded extends IScreen { } 

    class BaseScreen implements IScreen { 
     public HandleCloseEvent() { 

     } 
    } 

    class DetailsScreen extends BaseScreen implements IModal { 

    } 

    class ListScreen extends BaseScreen implements IEmbedded { 

    } 

    class OpenerService { 
     public OpenScreen(screen: IScreen) { 

     } 

     public OpenModal(modal: IModal) { 

     } 
    } 

    class Controller { 
     constructor(openerService: OpenerService) { 

      var detailsScreen: DetailsScreen = new DetailsScreen(); 
      var listScreen: ListScreen = new ListScreen(); 

      openerService.OpenModal(212121); // Expected error 
      openerService.OpenModal(listScreen); // Expected error 
     } 
    } 
} 
  • 我失去了,我沒有收到 任何錯誤,一些編譯器配置?
  • 我誤解了界面是如何工作的?
+0

我相信這是因爲你的接口是空的;它應該在你添加屬性時改變。 –

回答

2

這是打字稿工作的方式:與結構打字(也稱鴨打字)。

您聲明:

public OpenModal(modal: IModal) { 
    } 

因爲所有的接口都是空的,它相當於寫:

public OpenModal(modal: {}) { 
    } 

這個簽名接受每一個對象,因爲所有的對象都爲空對象兼容。 212121是一個對象(在JavaScript中,一個數字是一個對象)。 listScreen也是一個對象。

你可以看到它是無用的聲明幾個接口爲空的對象類型:

interface IScreen { } 
interface IModal extends IScreen { } 
interface ITab extends IScreen { } 
interface IEmbedded extends IScreen { } 

在這裏,所有的接口都是相同的。沒有層次結構。你可以這樣做:

let a: IScreen 
let b: IModal 
let c: IModal = a // type '{}' ('IScreen') is compatible to type '{}' ('IModal') 
let d = {} 
let e: IModal = d // type '{}' is compatible to type '{}' ('IModal') 

參見:

+0

謝謝,我的同事提到,行爲感覺像鴨子打字,我發現後的解決方案:D我唯一的問題是,它不可能在typeScript中有接口標記 – skmasq

相關問題