最新打字稿编译器版本中的可索引对象(0.9.5)

时间:2013-12-12 16:06:45

标签: javascript typescript

更新到0.9.5后,我在js-library的defenition中发现了一些错误。 让我通过代码解释一下情况。 这是我的JavaScript代码:

var Sample = lib.ClassImpl({
    ctor: function(array) {
        var me = this;
        this._items = array;
        this._items.forEach(function(name) {
            me[name] = new ItemWrapper(name); //Implemetation of ItemWrapper is unnecessary
        });
    },
    doSomething: function() {
        //some logic
    },
    returnSomething: function() {
        return this._items.length;
    }
});

这就是用法:

var sample = new Sample(["First", "Second", "Third"]);
sample.doSomething();
console.log(sample.returnSomething());
console.log(sample.First.method());
console.log(sample.Third.method());

在我为之前版本的TypeScript编译器(0.9.1.1)编写的打字稿防御中,我能够做到:

export interface ISampleBase {
    doSomething(): void;
    returnSomething(): number;
}
export interface ISample extends ISampleBase {
    [name: string]: ItemWrapper; //here is the error
}
export class Sample implemets ISampleBase {
    constructor(array: string[]);
    doSomething(): void;
    returnSomething(): number;  
}

然后在我的ts文件中使用它(intellisense就像魅力一样):

var sample: ISample = new Sample(["First", "Second", "Third"]);
sample.doSomething(); 
sample["Third"].method();

但是在更新到0.9.5之后我发现了一个错误,所有命名的属性都必须通过注释标记的字符串索引器类型ItemWrapper的子类型。 我有什么变种可以解决这个问题吗?

TypeScript playground with example.

1 个答案:

答案 0 :(得分:2)

在TypeScript中无法再表达这一点。这是一种固有的危险模式(例如,当我将["doSomething", "returnSomething"]传递给该构造函数时会发生什么?),不值得支持围绕字符串索引器的规则的复杂性。