我有一个接口IBase和一个包含一些其他对象的变量(在示例中,我只添加了基础部分以进行更好的演示)
interface IBase {
height?:number;
width?:number;
}
var element = {
base: {
}
}
如何表达变量element.base所持有的对象属于IBase类型?我知道可以为element变量创建一个包含base等类型的类型,但是是否有可能在不这样做的情况下对该场景进行类型化。
我有一个接口IBase和一个包含一些其他对象的变量(在示例中,我只添加了基础部分以进行更好的演示)
interface IBase {
height?:number;
width?:number;
}
var element = {
base: {
}
}
如何表达变量element.base所持有的对象属于IBase类型?我知道可以为element变量创建一个包含base等类型的类型,但是是否有可能在不这样做的情况下对该场景进行类型化。
Van den Brink 的回答很好。这里提供另一个示例选项:
var element = {
base: <IBase> {
}
}
var element: { base: IBase; } = {
base: {
}
}
注意:您也可以像这样创建一个新的接口,使其更具可重用性:
interface IElement {
base: IBase;
}
然后像这样使用它:
var element: IElement = { base: {} }@basarat的优秀回答现在需要稍作更新;使用尖括号现在会产生tslint
错误:
[tslint] 禁止使用'<>'语法进行类型断言。请改用'as'语法。(no-angle-bracket-type-assertion)
解决方案很简单:
const element = {
base: {} as IBase
}
const someData : SomeDataInterface = source1 ?? source2 ?? { /* Defaults */ } : SomeDataInterface
- Jesper Hoff你在接口声明方面出现了问题,这是一种你在结构化类型语言中会遇到的微妙问题。
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
}
}