从更多抽象类型继承的特定类型

问题描述

我是Typescript的新手,因此很抱歉。 我有一个与之相关的类和类型,如下所示。


    interface childType {
      a: string;
      b: string;
    }

    class Child extends Parent {
      instanceVar: childType
    }

该类从Parent扩展。 在父级中,instanceVar类型为Record 。 有一个名为getValues的函数,该函数枚举Record并返回字符串数组


    class Parent {
      instanceVar: Record<string,string>
    
      constructor(iV: Record<string,string>) {
        this.instanceVar = iV; 
      }

      getAllValues = (): Array<string> =>{
        let values : Array<string> = [];
        Object.keys(this.instanceVar).forEach((key) => {
          let val = this.instanceVar[key];
          values.push(val);
        })
        return values;
      }
    
    }

这当前不起作用,打字稿抱怨孩子中的instanceVar与父类型不同。但对我而言,这是因为“ childType”基本上是一个Record(将字符串映射到字符串),但是更“特定”。

我知道我可以使用泛型解决类型错误,但是我的真正目标是不必重写子类中的getValues函数。我想在父类中编写一次getValues,并将其应用于所有子类。这意味着子类中的instanceVar以某种方式从Record类型“继承”其类型。

解决方法

您可以使它成为父级的通用参数,而不是在子级中重新定义instanceVar。这也需要对Object.keys的值进行类型断言,因为默认情况下Typescript键入的类型要比您想要的宽得多,但这是非常标准的。试试:

class Parent<T extends Record<keyof T,string>> {
  instanceVar: T

  constructor(iV: T) {
    this.instanceVar = iV; 
  }

  getAllValues = (): Array<string> =>{
    let values : Array<string> = [];
    const keys = Object.keys(this.instanceVar) as (keyof T)[] // <-- type assertion
    keys.forEach((key) => {
      let val = this.instanceVar[key];
      values.push(val);
    })
    return values;
  }

}

interface childType {
  a: string;
  b: string;
}

class Child extends Parent<childType> {

}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...