假设我有我导入的这个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?
答案 0 :(得分:1)
TypeScript指出B
实际上不能被A<T1>
替代,因为B#set
与A#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.
}
}
}