我有以下类结构
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'的错误。
请记住我有很多类,我是否需要创建每个类的实例来设置/读取属性。我该怎么做才能使代码生效?
答案 0 :(得分:7)
第一个问题是.myOptions
上不存在chartOptions
- 您想要options
。您应该将所有类型都大写:MyOptions
,MyLegend
,这样就不会将它们与属性名称混淆。
第二个问题是虽然你实例化了一个新的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');
}
这正在生产和开发中。