我是否必须使用接口来使用typescript定义对象的元素?

时间:2014-08-23 23:42:08

标签: javascript typescript

我可以这样做:

var a: number = 99;

但是如何在对象内部定义a

var ob = { a: 99 }

class AClass {

    ob = { a: 99 };

    constructor() {
    }

}

使用界面是唯一的方法吗?

2 个答案:

答案 0 :(得分:3)

不需要界面。如果你只想定义对象的“形状”,而没有明确的类/接口声明,你可以这样做:

var ob: { a:number } = {a: 99};

在您的课程示例中,它看起来像这样:

class AClass {

    ob: { a:number } = { a: 99 };

    constructor() {
      // tsc knows that this.ob.a is of type number
    }

}

这也适用于复杂的对象:

    var ob: {
        a:number;
        b: {
            stringVal:string;
            numero:number;
            bitflag:Boolean
        }
    } = {
        a: 99,
        b: {
            stringVal: "Some string value here",
            numero:1234,
            bitflag:true
        }
    };

这种语法在函数声明中非常有用,你知道你期望一个具有特定属性的对象:

function(someObject: {stringVal:string; numero:number})
    // TypeScript now knows that someObject will have a "stringVal" string property, and a "numero" number property
}

现在,话虽如此,我建议您仔细考虑界面是否更适合。如果这是一个简单的对象形状,并且一次性情况不会再发生,那么声明内联形状(如上所述)可能没问题,但是如果你要有一个对象在其他地方具有相同的形状,将它声明为接口可能是有意义的,然后您可以重新使用该接口。如果你正在处理一个深层次的复杂对象,这是双重的。尝试全部内联可能会非常难看。

答案 1 :(得分:0)

你可以这样定义一个类:

var a: number = 99;

class Ob{
    constructor(public a: number){}
}

var newOb = new Ob(a);
newOb.a // should equal 99 then.