我在该接口中有一个接口,其中有一个名为data的属性,它是一个array. 所以看起来是这样的:

type Data = { prop1: string; prop2: string }[]; 

interface MyInterface {
  prop1: string;
  data: Data;
}

现在我有了RxJS流,

在该流中,接口为MyInterface.

所以现在我想在data属性中显示一些稍微不同的东西. 所以我所做的就是扩展添加新的价值

type DataExtended = Data & {
  newValue: string
}

将该新类型添加到扩展接口

interface MyInterfaceExtended extends MyInterface {
  data: DataExtended
}

现在在控制器中,我调用了一个服务,该服务具有一个预期结果为MyInterface的HTTP服务.但我需要更改该数据 struct ,因此我有以下内容:

var myData$ = Observable<MyInterfaceExtended>;

constructor(private myService:myservice){
  this.myData$ = this.myService.get().pipe((map(value)) => {
      foreach(value.data,  (data) =>{
        data.newValue = 'new';
      })
      return value
  })
}

但我一直收到这样的错误:

类型{ETC}上不存在‘newValue’

为什么会这样呢?

推荐答案

Assumption:

假设this.myService.get()返回Observable<MyInterface>.

DataExtended类型有一个问题,因为您将Data(由{ prop1: string; prop2: string }类型组成的数组)与对象{ newValue: string }组合在一起.

正确的类型应该是:

type DataExtended = Data &
  {
    newValue: string;
  }[];

用于现有类型.

或者,您应该将Data定义为单个对象而不是数组类型.

New types:

type Data = { prop1: string; prop2: string };

interface MyInterface {
  prop1: string;
  data: Data[];
}

type DataExtended = Data &
  {
    newValue: string;
  };

interface MyInterfaceExtended extends MyInterface {
  data: DataExtended[];
}

对于使用map RxJS运算符转换数据,您可以通过以下方式实现:

Solution 1 with existing types:

this.myData$ = this.myService.get()
  .pipe(
    map((response: any) => {
      let newResponse: MyInterfaceExtended = response;

      newResponse.data = newResponse.data.map((x) => ({
        ...x,
        newValue: 'new',
      }));

      return newResponse;
    })
  );

Solution 2 with the new types:

this.myData$ = this.myService.get()
  .pipe(
    map(
      (response: any) =>
        ({
          data: response.data.map(
            (x: Data) =>
              ({
                ...x,
                newValue: 'new',
              } as DataExtended)
          ),
        } as MyInterfaceExtended)
    )
  );

Demo @ StackBlitz

Typescript相关问答推荐

如何获取数组所有可能的索引作为数字联合类型?

动态判断TypScript对象是否具有不带自定义类型保护的键

动态调用类型化函数

如何键入函数以只接受映射到其他一些特定类型的参数类型?

有没有办法解决这个问题,类型和IntrinsicAttributes类型没有相同的属性?

为什么在回调函数的参数中不使用类型保护?

Angular NgModel不更新Typescript

记录键的泛型类型

使用动态输出类型和泛型可重用接口提取对象属性

将具有Readonly数组属性的对象接口转换为数组

声明文件中的类型继承

为什么TypeScrip不能解析对象析构中的赋值?

使用ngfor循环时,数据未绑定到表

如何在不违反挂钩规则的情况下动态更改显示内容(带有状态)?

棱角分明-什么是...接口类型<;T>;扩展函数{new(...args:any[]):t;}...卑鄙?

如何从接口中省略接口

编剧- Select 下拉框

在类型脚本中创建显式不安全的私有类成员访问函数

窄SomeType与SomeType[]

Next 13 + React 18 createContext 类型的构建问题