开始用TS了,痛苦的不行

看了众多大佬的推荐之后,这两天决定从JS转向TS的怀抱。

第一反应,智能提示针不戳,好方便;

第二反应,报错在哪儿也比JS定位精确,不用人肉判断错误位置了,再不戳一个;

第三反应,规矩好多啊!相比之下JS真的是随心所欲,就跟写自然语言一样了,TS果然像很多大佬说的,更像程序语言。

所以,我现在就是在学习各种新规矩中痛苦的前行。目前最先遇到的问题就是变量声明,以前JS的时候,就是随便写,总归能用的。现在搞了半天还是没掌握TS的写法,有个很具体的问题,求助下大佬们。

首先,下面这两种声明的方法有啥区别?看了很久都没看到有人说这个,难道这个问题太基础了?
第一种
@property
abc: string = null;
第二种
public/private abc: string = null;

其次,我想声明一个这种样子的数组,但使用的时候总是跳cannot read/set property ‘’ of null/undefined这些错误,有大佬能指点下么?
class xxx {
private static eventList: {eventName: string; eventNum: string;}[] = [] //这里要是写null的话,就报null的错误
var abc = “aaa”;

this.eventList[0].eventName = abc; //这里报cannot set property ‘eventName’ of undefined
}

讲道理,我新建的数组,肯定是空的没有数据的咯,总归有个第一次添加数据的操作吧,在TS里应该怎么做呢?

没有第三的痛苦,怎么会有第一第二的舒适呢?

我也明白这个道理,所以打算坚持用TS,就是。。。大佬帮忙看看这个具体问题,推我一把呗

第一是没区别,只有ts里智能提示的区别,在编译成js后是没区别的。

第二是因为你在tsconfig里用了严格模式。不用严格模式就可以了

“compilerOptions”: {

"strict": false,

},

可是的确是报错了,后续的代码都不执行了

那你统一用public吧,这就和js一毛一样了。

等一下,我说的是这个报错

这是因为你真的有错呀,怎么能向一个undefined里获取属性呢?? 即使是js也是一样的错

我主要就是不知道该怎么写才是正确的语法。。。

JS的时候,我就是类似的写法,就没啥问题,TS现在就不知道该咋写了

这不是语法问题,是你的this.eventList[0]这个变量就是一个undefined,向里面设置属性是不行的。js也是一样不行,跟ts没关系。 你应该先保证this.eventList[0]是一个合法变量

@property
abc: string = null;
和
public/private abc: string = null;

前面不写相当于public

这是开了严格模式之后,声明属性必须初始化.
提示null错误是因为在js/ts中null是一个类型,你可以这样写 = null!; 意思是给他一个空值

这里是因为你的数组类型是 {eventName: string; eventNum: string;}[]
而 eventList[0] 获取到的是null,null自然没有eventName属性了
你可以这样给第一个初始值

let obj = { eventName: "", eventNum: "" };
eventList[0] = obj;

道理我理解,不过我这是新建的空数组,我正式的代码里这里是需要用一个for循环把数组填充起来的,所以其实是eventList[i],但如果它是undefined,那。。。。。哎?难道必须用push?

你现在是编译出错了还是运行出错? 如果是编译出错的话,先把严格模式关了再看看吧。如果是运行出错,那就是你这个代码确实写错了。

运行出错,应该是代码写错了

你需要对象有这个属性才能 .eventName 而因为这个对象现在还没初始化,所以它并没有这个属性。你可以先初始化一个对象,再赋值

@property
abc: string = null;
第二种
public/private abc: string = null;

properties public 可以在脚本挂载到编辑器时 属性可见,可以对属性在编辑器中设置 private 不行

this.eventList[0].eventName = abc; //这里报cannot set property ‘eventName’ of undefined
}

这里是未声明这个属性,避免错误,你可以用 a[‘b’]来使用;
但是,我建议是在定义属性时就把这条属性加入这个类型,而不是让这个属性不一定存在

就是push

我用了你说的这个方法试图初始化,结果还是提示我cannot set property ‘0’ of null,感觉像是死循环,就是数组是空的,要初始化,初始化的时候认为数组是空的所以不给赋值。。。尴尬

let obj = { eventName: “”, eventNum: “” };
eventList[0] = obj;