为什么interface参数允许任何类型

时间:2017-03-02 12:07:19

标签: javascript visual-studio typescript visual-studio-2015 typescript2.0

我试图继承基本接口IScreen,它将使用IModal,IEmbedded或ITab进行扩展,并锁定方法以使它们特定于接口。但是,由于某种原因,方法foo = [ { "id":13, "title":"Some title 1", ... }, { "id":15, "title":"Some title 3", ... }] result = {} foo.each {|f| result[f.delete('id')] = f} 只接受任何类型。

Playground

public OpenModal(modal: IModal)
  • 我错过了一些我不喜欢的编译器配置 收到任何错误?
  • 我误解了接口是如何工作的吗?

1 个答案:

答案 0 :(得分:2)

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

你声明:

'\.'

因为所有接口都是空的,所以它等同于写:

   public OpenModal(modal: IModal) {
   }

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

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

listScreen

在这里,您的所有接口都是等效的。没有等级。你可以这样做:

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

另见: