在继承的泛型类型中找不到的方法

时间:2014-08-22 17:43:58

标签: generics typescript

我正在使用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的定义是错误的,但我看不出应该去哪里。

1 个答案:

答案 0 :(得分:1)

首先,不要影响泛型类型参数(例如A中的Functor#flatMap)。这很令人困惑。

这里的问题是TypeScript没有一个概念,即函数返回与调用对象相同的类型(参见this issue)。 Functor#flatMap的定义理想情况下会返回与调用对象相同的Functor - 子类型,但今天类型系统不支持此类。

您可以写这个来解决问题:

var bar = <Option<String>>x;