我正在使用Typescript类型系统和泛型,看看我能走多远。但看起来它没有从泛型类型中识别继承的方法。
考虑这段代码(Typescript Playground中的完整代码:http://goo.gl/vGZj2z):
interface Functor<A> {
flatMap <A,B> (f: (A) => B): Functor<B> // wrong?
}
interface Option<A> extends Functor<A> {
getOrElse(orElse: A): A
}
class Some<A> implements Option<A> {
private value: A
constructor(a: A) {
this.value = a;
}
flatMap <A,B> (f: (A) => B): Some<B> {
return new Some(f(this.value))
}
getOrElse(orElse: A): A {
return this.value
}
}
var test: Option<Number> = new Some(9)
var bar: Option<String> = test.flatMap(numberToString)
我对行var bar
...:
Cannot convert 'Functor<String>' to 'Option<String>': Type 'Functor<String>' is missing property 'getOrElse' from type 'Option<String>'.
它正在getOrElse
中寻找Functor<String>
,但在Option<String>
中没有看到它。
我的猜测是Functor
的定义是错误的,但我看不出应该去哪里。
答案 0 :(得分:1)
首先,不要影响泛型类型参数(例如A
中的Functor#flatMap
)。这很令人困惑。
这里的问题是TypeScript没有一个概念,即函数返回与调用对象相同的类型(参见this issue)。 Functor#flatMap
的定义理想情况下会返回与调用对象相同的Functor
- 子类型,但今天类型系统不支持此类。
您可以写这个来解决问题:
var bar = <Option<String>>x;