Javascript 为什么接口参数允许任何类型
我试图继承基本接口IScreen,它将用IModal、IEmbedded或ITab进行扩展,并锁定方法,以便它们特定于接口。但是,由于某种原因,方法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) { } 因为您的所有接口都是空的,
public OpenModal(modal:IModal)
只接受任何类型
- 我是否缺少一些我没有的编译器配置 收到任何错误吗
- 我是否误解了接口的工作方式
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')
另见:
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')