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

相关问题