覆盖打字稿中的继承类中的方法声明

时间:2019-06-20 03:19:05

标签: javascript typescript oop

假设我有我导入的这个javascript模块

class A {
  set (k, v) {
  }
}

然后我基于该模块实现自己的类

import A from 'module'

class B extends A {
  set (k, o) {
    super.set(k, o.v)
    // other stuff...
  }
}

此代码可以正常工作,但我要将自己的部分移植为打字稿(我是打字稿的新手)。 幸运的是,我要导入的模块具有类型定义,例如

class A<T> {
  set(k: string, v: T): void;
}

我正在像这样实现它

class T2 {
  v: T1;
}

class B extends A<T1> {
  set(k: string, o: T2): void {
    super.set(k, o.v)
  }
}

但是打字稿似乎不喜欢这样。我不断收到此错误

Type '(k: string, v: T2) => void' is not assignable to type '(k: string, value: T1): void;'

不确定如何对该方法的参数进行变异。如何从打字稿中的代码片段中获取有效的JavaScript?

1 个答案:

答案 0 :(得分:1)

TypeScript指出B实际上不能被A<T1>替代,因为B#setA#set不兼容。要使B可以代替A<T1>,您需要允许某人用set来呼叫T1

class B extends A<T1> {
  set(k: string, o: T1 | T2): void {
    if (o instanceof T2) {
      super.set(k, o.v); // Our new overload
    } else {
      super.set(k, o);  // The contract that A<T1> *must* support.
    }
  }
}