Javascript 重写typescript中继承类中的方法声明
假设我已经导入了这个javascript模块Javascript 重写typescript中继承类中的方法声明,javascript,typescript,oop,Javascript,Typescript,Oop,假设我已经导入了这个javascript模块 A类{ 集合(k,v){ } } 我基于这个模块实现了我自己的类 从“模块”导入 B类扩展了A类{ 集合(k,o){ 超级组(k,o.v) //其他东西。。。 } } 这段代码工作得很好,但我将我的部分移植为typescript(我是typescript新手)。 幸运的是,我导入的模块有它的类型定义,比如 class A<T> { set(k: string, v: T): void; } 不知道如何改变该方法的参数。如何从ty
A类{
集合(k,v){
}
}
我基于这个模块实现了我自己的类
从“模块”导入
B类扩展了A类{
集合(k,o){
超级组(k,o.v)
//其他东西。。。
}
}
这段代码工作得很好,但我将我的部分移植为typescript(我是typescript新手)。
幸运的是,我导入的模块有它的类型定义,比如
class A<T> {
set(k: string, v: T): void;
}
不知道如何改变该方法的参数。如何从typescript中的代码片段中获得有效的javascript?typescript指出,
B
实际上不能替代A
,因为B#set
与A#set
不兼容。要使B
替代A
,您需要允许某人使用T1
调用set
:
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.
}
}
}
B类扩展了A类{
集合(k:string,o:T1 | T2):无效{
if(T2的o实例){
super.set(k,o.v);//我们的新重载
}否则{
super.set(k,o);//A*必须*支持的契约。
}
}
}
我不知道TypeScript是否有办法强迫它接受,但无论如何,你不应该用不兼容的签名覆盖一个方法,因为你已经说过任何B
都是a
,所以接受a
的函数应该能够调用.set(k,o)
在带有o
的对象上,这是T1
,而不是T2
。
Type '(k: string, v: T2) => void' is not assignable to type '(k: string, value: T1): void;'
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.
}
}
}