2014-06-17 23 views
3

我有一个接口I基准和包含几个其他对象的变量(样品i中刚添加的碱为更好的示范)使用接口来输入打字稿一个匿名对象

interface IBase { 
    height?:number; 
    width?:number; 
} 

var element = { 
    base: { 

    } 
} 

我怎样才能说可变元素.base具有的对象来自IBase类型?我知道我可以为包含base等类型的元素变量创建一个类型,但是也可以在不这样做的情况下键入该场景。

回答

10

Van den Brink的答案很好。正如演示另一种选择:

var element = { 
    base: <IBase> { 

    } 
} 

这将得到期望的智能感知,以及:

enter image description here

+0

thx。这正是我正在寻找的:) – Safari

3

如果更改VAR元素的声明下面就知道基地是:

var element: { base: IBase; } = { 
    base: { 
    } 
} 

注意:您也可以为它创建这样一个新的接口,这使得它多一点的可重复使用: 界面IElement基底:IBase; } 然后像这里一样使用它: var element:IElement = {base:{}}

4

您不小心造成自己与你的接口声明的一个问题。这是一个微妙的,你会遇到结构类型的语言。

interface IBase { 
    height?:number; 
    width?:number; 
} 

因为所有的属性都是可选的,所以接口本质上是{}。即任何物体都满足这个界面。这太笼统了,无法在大多数情况下使用。

例如,它是完全可以接受的做到这一点:

var x: IBase = { 
    a: 'efsdsdf', 
    v: 'sdfdsf' 
}; 

我想你会同意,真的这个对象不是我想用一个IBase对象有用的任何地方。

通过这种方式,您可能会发现最优雅的解决方案是创建一个与您的element定义相匹配的界面。

interface IElement { 
    base: { 
     height?:number; 
     width?:number; 
    } 
} 

var element: IElement = { 
    base: { 
     height: 4 
    } 
}