在TypeScript中实例化一个类

时间:2015-12-16 16:49:01

标签: typescript

我有以下类结构

module ChartingServices {

export class ChartOptions {
    options: myOptions;
    title: string;
}

export interface myOptions {
    colors: string[];
    legend: myLegend;
    type: string;
}

export interface myLegend{
    enabled: boolean;
    labelFormatter: string;
}
}

我以通常的方式创建它的实例: -

var chartOptions = new ChartingServices.ChartOptions();

我可以毫无问题地设置属性chartOptions.title。

但是,我无法访问属性chartOptions.myOptions.type并收到有关无法读取未定义属性'type'的错误。

请记住我有很多类,我是否需要创建每个类的实例来设置/读取属性。我该怎么做才能使代码生效?

3 个答案:

答案 0 :(得分:7)

第一个问题是.myOptions上不存在chartOptions - 您想要options。您应该将所有类型都大写:MyOptionsMyLegend,这样就不会将它们与属性名称混淆。

第二个问题是虽然你实例化了一个新的ChartOptions

var chartOptions = new ChartOptions();

...其options属性实际上并未设置为任何内容,因此未定义。您需要在实例化后立即使用语句设置它:

chartOptions.options = {type: "foo", ...other non-optional properties here}

或者在ChartOptions的构造函数中,或者通过:

options: MyOptions = {type: "foo", ...}

答案 1 :(得分:0)

TypeScript在对象实例化方面与底层JavaScript(以及大多数其他语言)的行为类似:所有字段都初始化为undefined,除非您使用值覆盖它。

此外,无法实例化接口。相反,您必须提供与签名匹配的对象。如果您不想在开头提供所有字段,可以在界面中使用?标记字段,以便它们成为可选字段,然后您可以

export class ChartOptions {
    options: myOptions = {};
...

答案 2 :(得分:0)

就我而言,我只需要检查特定班级即可。我使用了'constructor.name',它在生产模式下崩溃了。

我在切换语句中使用了它,默认情况下出错了

switch (constructorInput.constructor.name) {
        case 'A':
            // do something
            break;
        case 'B':
            // do something
            break;
        default:
            throw new Error(constructorInput.constructor.name + ' is no valid Type');
    }

所以,我已经可以将其更改为instanceof

if (constructorInput instanceof A) {
        // do something
    } else if (constructorInput instanceof B) {
        // do something
    } else {
        throw new Error('no valid Type');
    }

这正在生产和开发中。