TS中要求所有Property都设定默认值不合理

我认为property一定要有默认值的设定不合理,尤其在使用TypeScript的时候,盲目的要求设定无意义的默认值,带来麻烦的同时并没有带来任何好处。

Creator的TS配置默认好像不启用 strictNullChecks,这其实是非常不安全的,任何变量/属性/类成员都可以在可能为空的情况下被访问,非常违背使用TS的初衷 – 保障类型安全。

strictNullChecks的好处参看:
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html
https://basarat.gitbooks.io/typescript/docs/options/strictNullChecks.html

当在tsconfig中启用 strictNullChecks 以后,初始化为 = null 是不合法的。

// 报错:[ts] Type 'null' is not assignable to type 'Node'.
@property(cc.Node) someNode: cc.Node = null;

必须要把类型设定为 Xxx | null,但这带来了新的问题,所有可以为空的属性在使用时都要做null check。这导致代码逻辑需要增加很多null check,会破坏代码可读性+逻辑的连贯性+开发体验。

// 合法
@property(cc.Node) someNode: cc.Node | null = null;

foo() {
  // 报错:[ts] Object is possibly 'null'.
  const a = this.someNode.x + this.someNode.y;
}

bar() {
  if (this.someNode) {
    // 合法
    const a = this.someNode.x + this.someNode.y;
  }
}

我认为比较合理的设定是,默认所有property都是非空且在Creator中必须绑定对象或者设定数值,同时允许配置property为可选的。这样的设定让Creator和脚本对于property是否可以为空有了统一的认知,Creator就可以在编译时检查所有绑定关系,对于没有赋值且必要的property进行更准确的报错。

举例:

@property(cc.Node) requiredNode: cc.Node;

@property({
  type: cc.Node,
  optional: true,
})
optionalNode?: cc.Node;

foo() {
  // 默认property为必填,可以直接访问。
  const a = this.requiredNode.x + this.requiredNode.y;
  // 可选property必须要做null check再访问。
  if (optionalNode) {
    const b = this.optionalNode.x + this.optionalNode.y;
  }
}

en 同样绝对很智障 也没给个解释

谢谢反馈,你的建议很好,我们有富余的人力时会实现这样的检查。之前主要是 Creator 现在还是主要基于 JS 开发,所以没有太多人力去投入在 TS 上面。TS 还有很多有待完善的地方,确实最终是没必要设定默认值的。

2赞

还有脚本循环引用的问题。。。