请指教,按照官方例子,使用import TS module后,输出为undefined

使用Cocos Creator v2.12
按照官网的文档:
// MyModule.ts
const {ccclass, property} = cc._decorator;

@ccclass
export class MyModule extends cc.Component {
@property (cc.String)
myName: string = “”;

@property (cc.Node)
myNode: cc.Node = null;

}

// MyUser.ts
const {ccclass, property} = cc._decorator;
import MyModule from ‘./MyModule’;

@ccclass
export class MyUser extends cc.Component {
@property (MyModule)
public myModule: MyModule = null;

public onLoad () {
    // init logic
    this.myModule.myName = 'John';
}

}

运行时报错:
Uncaught TypeError: Cannot set property ‘myName’ of null

怀疑是这里没赋值,但是如何赋值呢?

照你这个import写法,MyModule.ts里面的export class得改成export default class

或者import语句改为 import { MyModule } form ‘./MyModule’;
加一个花括号

去掉这一行,自己在onLoad时候new一个

default 确实是需要的,没有会报错,不知道官网为什么没有defaut。
自己是可以new一个。但是使用import是为了不同脚本或者不同场景切换时共享数据,自己new就没法共享数据了。

TS语法是这样的:
导入模块中的部分导出(对应export语句):
import { AAA, BBB, CCC } from ‘module_id’;
导入模块的默认导出(对应export default语句):
import DDD from ‘module_id’;
导入模块的默认导出兼部分导出:
import DDD, { AAA, BBB, CCC } from ‘module_id’;
导入模块导出的全部内容:
import * as All from ‘module_id’; // 常用于ES6模块

import All = require(‘module_id’); // 常用于CommonJS模块
顺便对于导入全部这种语法,如果要从All里面找到默认导出,得取All.default
即All.default === DDD
模块语法是用来在脚本之间共享固定对象用的,和new不new没关系,new是用来从构造函数实例化对象用的,这两个语法解决的是完全不同的问题

非常感谢你的回复。
你说的new一个是在 MyModule.ts 里面new, 还是在MyUser.ts里面new?

在哪new无所谓,关键是你要在两个文件之间共享的对象是谁,有些模块你只是想把构造函数(类)导出出去,有的模块你可能想导出的就是一个DataManager对象,只要是这个文件内定义的,那个文件内要共享着用,就要用导出导入功能
但看你的例子你的MyModule.ts定义了一个creator组件,这种情况下,一般被导出的都是构造函数(也就是类的定义)自己,然后在别的文件里访问这个类的定义就行了。而且对于Creator组件来说,是完全没有必要去new它的,一般都是引擎在运行起来后按需要去new,你只管addComponent或者loadScene

也就是说,cc.Component类和你继承它实现的子类,正常情况下都是由引擎来new实例,你完全不需要去new的,你new了也没用

目前我这边测试结果显示,cocos creator并不会主动实例化MyModule。
现在只能把MyModule当作一个公共类库来使用,哪里用哪里自己实例化。没有找到方法可以使用MyModule 在各个场景里共享数据。方法应该是有的,但是不知怎么做。
你方便写个小例子显示如何使用MyModule 共享数据的吗?

1.模块和类是完全无关的两个概念,模块解决的是脚本之间共享对象的问题,类解决的是用原型构造对象的问题。
2.JS语言中的一切设施都是“对象”,构造函数(类定义)当然也是一个对象,用模块功能共享构造函数到别的文件,符合“共享对象”这个说法。
3.我说的“用模块共享”对象,指的是JS中的“一切皆对象”的那个对象,不是具体指哪个类的实例。
4.我说模块和类是完全无关的功能,所以假如模块系统会替你new一个实例出来,这才不正常,不管有没有类,模块系统的功能都不会变。
举例:
// A.ts
let test = {A:555,B:666};
export default test;
// B.ts
import test from ‘./A’;
test.B === 666; // true
test这个对象,被模块这个功能共享到别的脚本文件中了,我指的是这个意思
被共享的可以是一切对象,包括构造函数,普通函数,你构造出的实例,你手动定义的对象……对JS来说,都是对象

而且你的MyModule作为一个Creator组件,就不应该再引擎之外的任何地方被new出来,只能引擎内替你new
你自己new出来也没用,所以我不明白你为什么会想要通过模块这一功能拿到MyModule的实例

从始至终我们说过要去new,只告诉过你不要试图自己去new
我只是回答你在前面对new的疑问而已。
告诉你说要new的是四楼,四楼不是我,我没说过要让你new

如果只是想做数据逻辑处理并共享出来,就不要继承cc.Component了

// MyModule.ts
class MyModule{
myName: string = “”;
}
export default new MyModule()

// MyUser.ts
import MyModule from ‘./MyModule’;
MyModule.myName = ‘John’

是的,import后是可以直接使用的。不需要在myuser里面定义mymodule类型的变量。
被官网文档误导了。