Javascript 打字稿上写着';对象可能为空';即使我明确地设定了它
因此我有一个接口Javascript 打字稿上写着';对象可能为空';即使我明确地设定了它,javascript,typescript,Javascript,Typescript,因此我有一个接口PropertyValue,其中属性descr\u json要么是一个对象,要么是null: export interface Property { descr_json: Array<string>; descr: string; id: number; } export interface PropertyValue { descr_json: { [key: string]: string } | null; descr
PropertyValue
,其中属性descr\u json
要么是一个对象,要么是null:
export interface Property {
descr_json: Array<string>;
descr: string;
id: number;
}
export interface PropertyValue {
descr_json: { [key: string]: string } | null;
descr: string | number | null;
id?: number;
}
但是在forEach
中,TS抱怨propertyValue.descr\u json
可能为null,尽管我在前一行明确地将其设置为空对象
当然,我可以用一个额外的if
语句来检查descr\u json
实际上不是null,但这似乎是多余的,因为我已经知道这一点
我在这里遗漏了什么?我相信您可以使用来告诉transpiler,即使它可能为空,也请将其视为绝对不为空
在需要将其视为“真的不为null”的情况下,使用非null断言运算符(感叹号)对其进行后缀
我认为transpiler并不关心您是否定义了它,它只关心类型是什么,以及它的是否可以为null
(即数字还是字符串?)然后它的类型实际上是string | null
或number | null
,transpire将不关心您是否显式设置了它。这就是我所相信的,如果我错了,有人会纠正我
var x : string | null = null
var y = x.substring(0, x.length / 2); // oop! it could be null compilation error
var y = x!.substring(0, x!.length / 2); // use of assert non null operator prevents transpilation error
另一种可能的替代方法是使用正确类型的临时对象,然后将其分配给descr\u json
const temp: { [key: string]: string } = {};
property.descr_json.forEach(subProperty => {
temp[subProperty] = '';
});
pValues.descr_json = temp;
descr\u-json[subperty]
因此descr\u-json
没有提及该权利?因此,在对象上使用.length
和.forEach()
是未定义的?否,属性。descr\u json
是一个数组:)pValues。descr\u json
是一个对象。您显示了两个变量属性
和pValues
,但只有一个接口属性值
,并且没有类型声明(在赋值或任何地方)。我们怎么知道如何调试它?我的错是,我假设对象具有相同的形状,因为它们具有相同的属性descr\u json
。
const temp: { [key: string]: string } = {};
property.descr_json.forEach(subProperty => {
temp[subProperty] = '';
});
pValues.descr_json = temp;