返回 super 时,子类方法重写不可分配给基类型中的相同属性

问题描述 投票:0回答:1

假设我想使用重写的

Promise
方法来扩展
then()
类,该方法在调用
super.then()
之前执行某些操作:

class ExtendedPromise<T> extends Promise<T> {
  then(...x: Parameters<InstanceType<typeof Promise<T>>["then"]>) {
    console.log("Do something here");
    return super.then(...x);
  }
}

游乐场

TypeScript 抱怨此覆盖无法分配给基本类型中的同一属性,因为

unknown
无法分配给类型
TResult1 | TResult2
,但这怎么可能呢?我接受与父类型相同的参数,并实际上返回 super 的返回值,因此类型应该全部相同?

typescript
1个回答
0
投票

那是因为

Promise
then
方法具有可能独立于
Promise
的泛型类型的泛型,因为您没有为 then 函数提供这些泛型,所以它采用默认的泛型类型,即
<T, never>
,您可以通过静态键入函数参数的类型并在
<TResult1 = T, TResult2 = never>
之后添加
then
来解决此问题,因为我找不到一种方法来为字符串索引中的
then
提供通用类型,例如,您想要的这个案例是这样的:

class ExtendedPromise<T> extends Promise<T> {
    then<TResult1 = T, TResult2 = never>(...x: Parameters<InstanceType<typeof Promise<T>>["then"]<TResult1, TResult2>>) { // this does not work unfortunately
        console.log("Do something");
        return super.then(...x);
    }
}

如果您决定静态输入参数,这里是代码

class ExtendedPromise<T> extends Promise<T> {
    then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null | undefined, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined) {
        console.log("Do something");
        return super.then(onfulfilled, onrejected);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.