3

IModal、IEmbeddedまたはITabで拡張される基本インターフェイスIScreenを継承しようとしていて、インターフェイスに固有のメソッドをロックするようにしています。しかし何が起こるかは、方法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の直後に解決策を見つけました:Dこれだけの問題は、typeScriptにインターフェイスマーカーを持つことができないことです – skmasq

関連する問題