第一篇文章请善待...我最近一直在修补 TypesScript 泛型,我试图了解泛型的工作方式(或者在我的情况下没有),我已经放置了损坏的泛型和工作在同一个共享 Playground (http://goo.gl/xGNoKy) 中的类的版本,希望它能在旅途中幸存下来,否则这些都没有意义。
如您所见,损坏版本和工作版本之间的区别在于我只是将对枚举的引用更改为对通用参数的引用。您会注意到,在 playground 的 TypeScript 端,使用通用参数的地方会出现三个小问题。我认为这是一个约束问题,但经过几次尝试并感谢查看生成的 Javascript,我决定我需要找到一个论坛并向更有经验/专家的 typescript 程序员提问。
我能做些什么来诱使编译器将泛型类型传递给构造函数,就像它对“ super ”类型所做的一样?查看输出也解释了为什么我在尝试在不同的上下文中使用 (CRTP) 时遇到问题,我在这里缺少什么,这是否可能不诉诸于一些粗略的手动编辑?
-- BPT
最佳答案
这是最终的工作代码
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
上使用一些成员,我们需要说明它必须扩展
一些接口(interface)。为此,我创建了MultiGroupState
。 - 接口(interface)的成员数。所以
currentState
、lastState
和state
参数需要是数字。
关于generics - TypeScript 泛型传递枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25027656/