TypeScript泛型传递枚举

时间:2014-07-30 02:01:46

标签: generics typescript crtp

第一篇帖子请好心......我最近一直在修补TypesScript泛型,我试图理解一些关于泛型工作方式(或者在我的情况下没有),我放置了破坏的泛型和该类的工作版本位于同一个共享操场(http://goo.gl/xGNoKy)中,希望它能够在旅行中幸存下来,否则这一切都没有意义。

正如您所看到的,中断版本和工作版本之间的区别在于我只是将对枚举的引用更改为对泛型参数的引用。您会注意到,在操场的TypeScript端,有三个小问题显示在使用泛型参数的位置。我认为这是一个约束问题,但经过几次尝试后,感谢查看生成的Javascript,我决定找一个论坛,向更多经验丰富的专家打字稿程序员提问。

我能做些什么会诱使编译器将泛型类型传递给构造函数,就像它对超级'那样。类型?查看输出还解释了为什么我在不同的上下文中尝试使用(CRTP)的问题,我在这里缺少的是这可能不需要采用一些粗略的手动编辑?

- BPT

1 个答案:

答案 0 :(得分:2)

这是最终的工作代码

enum eMultiGroupState { UP, DOWN, OVER, OUT, TOTAL_STATES, DEFAULT = UP, FIRST = UP }
class SomeBase { constructor(arg) {} children:any[] = []; }
function Something( info, context, fn ) { fn.apply( context, info ); }

interface MultiGroupState{
        FIRST:number;
        TOTAL_STATES:number;
        DEFAULT: number;        
}

class Broken<T extends MultiGroupState> {
    currentState:number;
    lastState:number;    
    activeState:any;
    constructor(public states:T,arg) {       

        Something( true, this, function() {
            for ( var s = states.FIRST; s < states.TOTAL_STATES; s++ ) {
                var lower = states[s].toLowerCase();
                for ( var child = 0, count = this.children.length; child < count; ++child ) {
                    if ( -1 !== this.children[child].name.indexOf(lower) ) {
                        this.states[ s ] = this.children[child];
                        break;
                    }
                }
            }
            this.setState(this.states.DEFAULT );
        });
    }
    setState( state:number ) {
        if ( state === this.currentState ) return;
        this.lastState = this.currentState;
        this.currentState = state;
        this.activeState = this.states[ state ];
        for ( var i in this.states ) this.states[i].visible = (this.activeState === this.states[i]);
    }
}

注意事项:

  • 要在通用约束T上使用某些成员,我们需要说它必须extend某个界面。我为此创建了MultiGroupState
  • 界面成员的数字。因此currentStatelastStatestate参数必须是数字。