Cocos Code IDE打开TypeScript编译的.js文件报错

我用TypeScript来写Cocos2d-js小游戏,在webstorm下开发的,然后在Cocos Code IDE下可以运行,但是一旦打开编译的.js文件就报错了,是解析js的插件解析不了?

Error Log:
java.lang.NullPointerException
at java.lang.String.(Unknown Source)
at org.ccdt.a.a.b.a(Unknown Source)
at org.ccdt.a.a.b.a(Unknown Source)
at org.ccdt.jsdt.internal.compiler.parser.Parser.parse(Unknown Source)
at org.ccdt.jsdt.internal.compiler.parser.Parser.parse(Unknown Source)
at org.ccdt.jsdt.internal.compiler.SourceElementParser.parseCompilationUnit(Unknown Source)
at org.ccdt.jsdt.internal.core.CompilationUnit.buildStructure(Unknown Source)
at org.ccdt.jsdt.internal.core.Openable.generateInfos(Unknown Source)
at org.ccdt.jsdt.internal.core.JavaElement.openWhenClosed(Unknown Source)
at org.ccdt.jsdt.internal.core.BecomeWorkingCopyOperation.executeOperation(Unknown Source)
at org.ccdt.jsdt.internal.core.JavaModelOperation.run(Unknown Source)
at org.ccdt.jsdt.internal.core.JavaModelOperation.runOperation(Unknown Source)
at org.ccdt.jsdt.internal.core.CompilationUnit.becomeWorkingCopy(Unknown Source)
at org.ccdt.jsdt.internal.ui.javaeditor.CompilationUnitDocumentProvider.createFileInfo(Unknown Source)
at org.eclipse.ui.editors.text.TextFileDocumentProvider.connect(TextFileDocumentProvider.java:478)
at org.ccdt.jsdt.internal.ui.javaeditor.CompilationUnitDocumentProvider.connect(Unknown Source)
at org.eclipse.ui.texteditor.AbstractTextEditor.doSetInput(AbstractTextEditor.java:4230)
at org.eclipse.ui.texteditor.StatusTextEditor.doSetInput(StatusTextEditor.java:237)
at org.eclipse.ui.texteditor.AbstractDecoratedTextEditor.doSetInput(AbstractDecoratedTextEditor.java:1480)
at org.ccdt.jsdt.internal.ui.javaeditor.JavaEditor.b(Unknown Source)
at org.ccdt.jsdt.internal.ui.javaeditor.JavaEditor.doSetInput(Unknown Source)
at org.ccdt.jsdt.internal.ui.javaeditor.CompilationUnitEditor.doSetInput(Unknown Source)
at org.eclipse.ui.texteditor.AbstractTextEditor$19.run(AbstractTextEditor.java:3217)
at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:464)
at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:372)
at org.eclipse.ui.internal.WorkbenchWindow$13.run(WorkbenchWindow.java:1829)
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:1826)
at org.eclipse.ui.texteditor.AbstractTextEditor.internalInit(AbstractTextEditor.java:3235)
at org.eclipse.ui.texteditor.AbstractTextEditor.init(AbstractTextEditor.java:3262)
at org.eclipse.ui.internal.EditorReference.initialize(EditorReference.java:359)
at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.create(CompatibilityPart.java:306)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:56)
at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:877)
at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:857)
at org.eclipse.e4.core.internal.di.InjectorImpl.inject(InjectorImpl.java:119)
at org.eclipse.e4.core.internal.di.InjectorImpl.internalMake(InjectorImpl.java:333)
at org.eclipse.e4.core.internal.di.InjectorImpl.make(InjectorImpl.java:254)
at org.eclipse.e4.core.contexts.ContextInjectionFactory.make(ContextInjectionFactory.java:162)
at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.createFromBundle(ReflectionContributionFactory.java:102)
at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.doCreate(ReflectionContributionFactory.java:71)
at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.create(ReflectionContributionFactory.java:53)
at org.eclipse.e4.ui.workbench.renderers.swt.ContributedPartRenderer.createWidget(ContributedPartRenderer.java:129)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createWidget(PartRenderingEngine.java:949)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:633)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:735)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$2(PartRenderingEngine.java:706)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$7.run(PartRenderingEngine.java:700)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:685)
at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer.showTab(StackRenderer.java:1147)
at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer$1.handleEvent(LazyStackRenderer.java:65)
at org.eclipse.e4.ui.services.internal.events.UIEventHandler$1.run(UIEventHandler.java:41)
at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:180)
at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:150)
at org.eclipse.swt.widgets.Display.syncExec(Display.java:4688)
at org.eclipse.e4.ui.internal.workbench.swt.E4Application$1.syncExec(E4Application.java:205)
at org.eclipse.e4.ui.services.internal.events.UIEventHandler.handleEvent(UIEventHandler.java:38)
at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:197)
at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:197)
at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1)
at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:135)
at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:78)
at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:39)
at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:80)
at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:58)
at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:374)
at org.eclipse.e4.ui.model.application.ui.impl.ElementContainerImpl.setSelectedElement(ElementContainerImpl.java:171)
at org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.showElementInWindow(ModelServiceImpl.java:576)
at org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.bringToTop(ModelServiceImpl.java:543)
at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.delegateBringToTop(PartServiceImpl.java:619)
at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.bringToTop(PartServiceImpl.java:331)
at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.showPart(PartServiceImpl.java:1046)
at org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:3112)
at org.eclipse.ui.internal.WorkbenchPage.access$21(WorkbenchPage.java:3034)
at org.eclipse.ui.internal.WorkbenchPage$8.run(WorkbenchPage.java:3016)
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:3012)
at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2976)
at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2967)
at org.eclipse.ui.ide.IDE.openEditor(IDE.java:534)
at org.eclipse.ui.ide.IDE.openEditor(IDE.java:493)
at org.ccdt.jsdt.internal.ui.javaeditor.EditorUtility.a(Unknown Source)
at org.ccdt.jsdt.internal.ui.javaeditor.EditorUtility.openInEditor(Unknown Source)
at org.ccdt.jsdt.ui.a.ca.a(Unknown Source)
at org.ccdt.jsdt.ui.a.ca.run(Unknown Source)
at org.ccdt.jsdt.ui.a.dd.b(Unknown Source)
at org.ccdt.jsdt.ui.a.dd.run(Unknown Source)
at org.ccdt.jsdt.internal.ui.packageview.PackageExplorerActionGroup.a(Unknown Source)
at org.ccdt.jsdt.internal.ui.packageview.PackageExplorerPart$5.open(Unknown Source)
at org.eclipse.jface.viewers.StructuredViewer$2.run(StructuredViewer.java:866)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:49)
at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175)
at org.eclipse.jface.viewers.StructuredViewer.fireOpen(StructuredViewer.java:864)
at org.eclipse.jface.viewers.StructuredViewer.handleOpen(StructuredViewer.java:1152)
at org.eclipse.jface.viewers.StructuredViewer$6.handleOpen(StructuredViewer.java:1256)
at org.eclipse.jface.util.OpenStrategy.fireOpenEvent(OpenStrategy.java:275)
at org.eclipse.jface.util.OpenStrategy.access$2(OpenStrategy.java:269)
at org.eclipse.jface.util.OpenStrategy$1.handleEvent(OpenStrategy.java:309)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1057)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4170)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3759)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1113)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:997)
at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:140)
at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:611)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:567)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:354)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:181)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:636)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:591)
at org.eclipse.equinox.launcher.Main.run(Main.java:1450)

我将这个问题给老杨看,让他看一下是为什么。

我这里有几个问题请教楼主:

  1. 为什么选用TypeScript,选中的原因是啥?

  2. 你是通过什么方式将Cocos2d-JS的API暴露为TS的API

我们最近也在评估默认支持TS,但是需要收集更多的需求评估情况,以及采用一个易维护的方案。如果有其他同学也在用TS,请也来发表下你的看法。

能否把出错的js代码示例给一份呢?我们好调试下,看看哪里出问题了。

一、我选TS的原因有我几个原因:

  1. 我觉得JS的原型式的OO语法过于动态了,写起来东西来感觉不太严谨,容易出错。JS实际上没有“类”的概念,用一些“非常手段"去实现类,我个人用的不是太爽,TS拓展了JS的语法,具有”class“,”public",“private”,“static"这些关键字,写起来比较严谨规范。
  2. 我个人是Flash开发的,对AS比较有感情,使用TS更顺手一点

二、我目前就是手动写一个TS的.d.ts文件,相当于C++的头文件,把我用到的C2dx的类名和方法名(包括参数)逐步加进去,这样在TS代码引入就可以起到提示和编译器检查的作用了,暂时没有发现有什么工具把第三方js库的API生成这个.d.ts,当然可以想办法写脚本生成

怎么给你呢?直接粘贴出来?

这个是我按照模版app.js用ts编译后的.js文件

有人一年前写过cocos2d-h5的.d.ts,版本比较久了 https://github.com/Arlorean/cocos2d

同意楼主的意见,js和lua这类的脚本语言对于没接触过脚本语言,而习惯了写强面向对象语言的程序员来说,很不习惯。我们认同js和lua都很优秀,也非常适合于手游开发,毕竟版本迭代和审核上个不可忽视的问题。但习惯和认知在那。我接触到的很多转手游的开发人员中大多都是前几年还从事页游开发的flash开发者。TypeScript是js的一个超集,其语法也适合面向对象的特征。cocos2d-js封装一下就可轻松过度到cocos2d-ts。

是的,封装一下是可以达到要求。但是维护的成本略大,我们在探索下,是否有工具或者脚本可以自动转换,减少人工干涉和维护的成本,提高一致性。

是的,用自动化脚本工具是最好的选择。大家也都可以自己下去找找有什么方案

我有个想法就是既然jsDoc的标签可以生成Api文档,也应该可以去解析这些标签来生成ts的.d.ts,但是目前没有时间去做这个:12:

求官方支持 typescript 。

好处就是大项目支持比较好,强类型检查,很多错误可以在编译的时候就发现。

而且强OOP支持可以让团队协作更容易,让C++/C# 系的人接受JavaScript 更容易。

cocos2d-js 的 d.ts 还能自己写,但是 typescript 的 extends 方式 和 cocos2d-js 的 继承方式不一样。

如果是html5,用typescript就没问题,如果是native 编译,就有问题了。不知道你们评估typescript的时候有没有考虑这个…… 目前我的项目里就因为native 编译不支持暂时放弃用ts.

无法运行,应该是ctor和 typescript 的 super 不兼容的问题。 如果楼主愿意可以试试这个。 http://www.cocoachina.com/bbs/read.php?tid=219207 。类型定义文件 .d.ts 就得自己找了。

用 jsdoc 来生成 .d.ts 文件再加上人工修改,应该是可行的。有人已经这么做了 https://github.com/fivetran/typescript-closure-tools

不知道说得合不合适,官方可以参考下Egret的实现方式,他们是用TS写逻辑生成js跨平台,也做了native编译

js脚本太灵活了,,项目时间稍微长点自己写的代码自己都不记得了,,用非类的东西去实现一个类,是很蛋碎的事情,,原有的面向对象设计的框架在js里面都用起来很累人
强烈建议使用typescript,,这也是我现在犹豫使用cocos-js的唯一因素,,,如果使用的是typescript的话比起lua已经就不是一个档次的东西了

我没有实际运行,不过可以尝试一下在JSB中,这样修改TS的默认继承方式,用下面的代码替换掉__extends的定义


var ClassManager = {
    id : (0|(Math.random()*998)),

    instanceId : (0|(Math.random()*998)),

    getNewID : function(){
        return this.id++;
    },

    getNewInstanceId : function(){
        return this.instanceId++;
    }
};

var __extends = this.__extends || function (d, parent) {
    var _super = parent.prototype;

    // Instantiate a base class (but only create the instance,
    // don't run the init constructor)
    initializing = true;
    var prototype = Object.create(_super);
    initializing = false;
    fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;

    // The dummy class constructor
    function Class() {
        // All construction is actually done in the init method
        if (!initializing) {
            if (!this.ctor) {
                if (this.__nativeObj)
                    cc.log("No ctor function found! Please check whether `classes_need_extend` section in `ini` file like which in `tools/tojs/cocos2dx.ini`");
            }
            else {
                this.ctor.apply(this, arguments);
            }
        }
    }

    var classId = ClassManager.getNewID();
    ClassManager = _super;
    var desc = { writable: true, enumerable: false, configurable: true };
    d.id = classId;
    desc.value = classId;
    Object.defineProperty(prototype, '__pid', desc);

    // Populate our constructed prototype object
    d.prototype = prototype;

    // Enforce the constructor to be what we expect
    d.prototype.constructor = Class;
};

能具体说说是修改哪个文件吗? 或者能提供修改后的文件吗?