为什么TypeScript模块不能实现或遵守接口?我可以解决这个问题吗?

时间:2013-04-18 00:18:10

标签: typescript

似乎在TypeScript中要求模块实现接口非常有用。他们选择不实施这种能力有什么特别的原因吗?

我想不出任何理由为什么不允许模块实现接口,但如果是,那么还有其他方法要求模块提供一组特性/方法吗?

2 个答案:

答案 0 :(得分:4)

如果模块不遵守这样的接口(技术上非零运行时开销,但实际上不太重要),则可以强制编译错误:

interface foo {
    bar(): number;
}

module mod {
    export function bar(): number {
        return 0;
    }
}
var mod_is_foo: foo = mod; // errors if you change 'number' to 'string' above

至于为什么不能说module mod implements fooAll features start at minus 100

编辑添加 - 如果你想避免创建一个新的顶级var,可以用以下其他(有些古怪的)代替上面的var语句:

<foo>mod; // Shortest, probably fastest?
<foo>undefined === mod; // Clearest non-var version?

答案 1 :(得分:1)

Ryan实际上是在打字稿团队,所以他的回答几乎是最终的。但我个人认为它不能提供你所寻求的语法。

原因是模块更像是一个实例而不是可以实例化的东西(例如一个类)。通过这种方式,它更接近于var而不是类。

因此,理由与你写作的原因类似:

var x:foo; 

而不是

var x implements foo;

模块的行为与你可以做的相同

var y:foo = mod;
正如瑞安已经指出的那样。

同时检查一下:

interface foo {
    bar(): number;
}

module mod {
    export function bar(): number {
        return 0;
    }
}

var x: foo; 
x = mod;

// Still a bit whacky but allowed as module is a type as well as an instance
var y:mod;
y = x;