TypeScript泛型:如何传递枚举类型

4
请友善点评我的第一篇帖子……我最近一直在尝试使用 TypeScript 泛型,并试图理解泛型的工作方式(或者说我的情况下没有工作),我已经将破损的泛型和类的工作版本放置在同一个共享游乐场中(http://goo.gl/xGNoKy),希望它能够生存下来,否则这一切都没有意义。
正如您所看到的,破碎版和工作版本之间的区别在于我只是将对枚举的引用更改为对泛型参数的引用。您会注意到,在 TypeScript 部分的游乐场上,有三个次要问题显示出泛型参数的使用情况。我以为这是一个约束问题,但尝试了几次并查看了生成的 Javascript 后,我决定需要找一个论坛并向更有经验的 TypeScript 程序员提问。
我该怎么做才能让编译器像处理“super”类型一样传递泛型类型到构造函数中呢?查看输出还解释了为什么我在不同的上下文中尝试使用 CRTP 时遇到问题,我在这里缺少什么,有没有可能不通过一些粗糙的手动编辑来实现呢?
-- BPT

你认为你可以“仅仅将枚举的引用更改为泛型参数的引用”,这是什么逻辑? - PM 77-1
简单来说,我想要用与原类型使用方式一致的任何类型替换特定类型的使用(在这种情况下,它是一个枚举)。 - lardratboy
接口和枚举在TypeScript中是一场噩梦。 - GôTô
1个回答

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参数需要为数字。

我进一步探索了泛型+枚举的事情,并找到了一种引导所需行为的方法。然而,关于这种使用枚举的方式仍有一些奇怪的问题。如果有人想看看这些问题,请访问http://goo.gl/E0AWlx。 - lardratboy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接