Javascript 为什么接口参数允许任何类型

Javascript 为什么接口参数允许任何类型,javascript,visual-studio,typescript,visual-studio-2015,typescript2.0,Javascript,Visual Studio,Typescript,Visual Studio 2015,Typescript2.0,我试图继承基本接口IScreen,它将用IModal、IEmbedded或ITab进行扩展,并锁定方法,以便它们特定于接口。但是,由于某种原因,方法public OpenModal(modal:IModal)只接受任何类型 我是否缺少一些我没有的编译器配置 收到任何错误吗 我是否误解了接口的工作方式 这是TypeScript的工作方式:使用结构类型(也称为duck类型) 你宣布: public OpenModal(modal: IModal) { } 因为您的所有接口都是空的,

我试图继承基本接口IScreen,它将用IModal、IEmbedded或ITab进行扩展,并锁定方法,以便它们特定于接口。但是,由于某种原因,方法
public OpenModal(modal:IModal)
只接受任何类型

  • 我是否缺少一些我没有的编译器配置 收到任何错误吗
  • 我是否误解了接口的工作方式

这是TypeScript的工作方式:使用结构类型(也称为duck类型)

你宣布:

   public OpenModal(modal: IModal) {
   }
因为您的所有接口都是空的,所以它相当于写入:

   public OpenModal(modal: {}) {
   }
此签名接受每个对象,因为所有对象都与空对象兼容
212121
是一个对象(在JavaScript中,数字是一个对象)<代码>列表屏幕也是一个对象

您可以注意到,为空对象类型声明多个接口是无用的:

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')
另见:


我认为发生这种情况是因为您的接口是空的;当你添加属性时,它应该会改变。谢谢,我的同事提到,这种行为感觉像鸭子打字,我在下面找到了解决方案:D这是我唯一的问题,在typeScript中不可能有接口标记
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')