TypeScript 编译器崩溃:publicMembers 为 null 或未定义

Posted

技术标签:

【中文标题】TypeScript 编译器崩溃:publicMembers 为 null 或未定义【英文标题】:TypeScript compiler crash: publicMembers is null or undefined 【发布时间】:2012-10-09 14:49:45 【问题描述】:

下面显示的代码以其当前形式编译和执行,没有错误——但是,一旦第 19 行的“getNextAsyncTasks”类型声明被取消注释,编译器就会崩溃并出现以下错误:

    内部错误:无法获取属性“publicMembers”的值:对象为空或未定义 内部错误:IntelliSense 功能被禁用。尝试对源文件进行编辑以恢复有效的编译状态。 无法获取属性“publicMembers”的值:对象为 null 或未定义 命令 ""C:\Program Files (x86)\Microsoft SDKs\TypeScript\0.8.0.0\tsc" ... " 退出,代码为 1。

虽然我知道如何在这种特殊情况下避免这种情况,但当我在代码库的其他区域工作时,错误会一直默默发生。调试起来可能相当困难,因为当我注意到它发生时,我经常进行大量更改,并且不知道这次问题可能来自哪里。

理想情况下,如果有人能告诉我导致此崩溃发生的原因,我将不胜感激,以便我更好地了解如何避免它/解决它。

module abstract 
    export interface ICallback 
        (...args: any[]): any;
    
    export interface IAsyncOp 
        (callback: ICallback): any;
    


export class Chain 
    task : abstract.IAsyncOp;

    constructor(...tasks : abstract.IAsyncOp[]) 
        if (tasks.length === 1)     this.task = tasks[0];
        else if (tasks.length > 1)  this.task = cb => this.sync(() => cb.apply(null, arguments), tasks);
        else                        this.task = cb => cb();
    

    next(getNextAsyncTasks /*: (...args: any[]) => abstract.IAsyncOp*/) 
        return new Chain(
            (cb: abstract.ICallback) =>
                this.task(
                    () => getNextAsyncTasks.apply(null, arguments)(cb);
                )
        );
    

    last(cb : abstract.ICallback) 
        this.task(cb);
    

    sync(cb: (...resultArgs: IArguments[]) => void, tasks: abstract.IAsyncOp[]) 
        var resultArgs : IArguments[] = [], done = 0;

        var getCb = (i) => 
            return () => 
                resultArgs[i] = arguments;
                done++;

                if (done === tasks.length) cb.apply(null, resultArgs);
            
        ;

        for (var i = 0, op; op = tasks[i]; i++) op(getCb(i));
    


// use example
new Chain( cb => setTimeout(() => cb("foo"), 60)
         , cb => setTimeout(() => cb("bar"), 10)
         ).next((op1, op2) =>  console.log(op1, op2)
                              ; return cb => setTimeout(() => cb(op1[0], op2[0]), 120)
                              
         ).next((foo, bar) =>  console.log(foo, bar)
                              ; return cb => setTimeout(() => cb(foo, bar, "baz"), 30)
                              
         ).last((foo, bar, baz) => console.log(foo, bar, baz));

编辑:更新了“下一个”,因此参数的类型签名将始终正确。

【问题讨论】:

【参考方案1】:

这看起来像是一个编译器错误,我会提交报告here。我尝试了很多方法来解决它,但都没有奏效。这很有趣,因为在您尝试在示例中使用它之前,崩溃实际上并没有表现出来。

【讨论】:

报告了崩溃,参考链接:typescript.codeplex.com/workitem/286

以上是关于TypeScript 编译器崩溃:publicMembers 为 null 或未定义的主要内容,如果未能解决你的问题,请参考以下文章

Angular 8 Native Typescript 无崩溃,访问器简写

编译TypeScript(TypeScript转JavaScript)

译文:Static TypeScript,TypeScript 的一种静态编译器实现

将 typescript 错误连接到其关联的编译器选项 (tsconfig.json)

第一章 Typescript 介绍

WebPack 中的 Typescript (at-loader) 编译器错误